Set a query filter

Hallo.
I have a user and a skill table joined in a SkillUser table. (has many
through)
Now I try to get all Skills listed which are not already in the join
table
for user 1

In other words: user 1 has entries in the SkillUser table for skill 1
and
2. And I want to get skill 3…to …in the result, but not 1 or 2.

I have tried:

skills = Skill.sort.includes(:skill_users).where(‘skill_users.user_id
NOT
IN (?)’, @user.id)

But then I only get all the skills listed for all other users already
listed in the SkillUser table.

Somehow I thing about a filter like
skill = Skill.sort
skill.filter(substract skills for user x which are already in SkillUser)

Any idea? Thanks for help…

On Fri, Sep 21, 2012 at 2:48 AM, Werner
[email protected] wrote:

I have a user and a skill table joined in a SkillUser table. (has many
through)
Now I try to get all Skills listed which are not already in the join table
for user 1

Stop thinking in terms of tables and think about your models, e.g.

skills_you_want_to_display = Skill.all - user.skills


Hassan S. ------------------------ [email protected]

twitter: @hassan

Am 21.09.2012 um 17:40 schrieb Hassan S.
[email protected]:

On Fri, Sep 21, 2012 at 2:48 AM, Werner [email protected] wrote:
Hi Hassan…

I have a user and a skill table joined in a SkillUser table. (has many
through)
Now I try to get all Skills listed which are not already in the join table
for user 1

Stop thinking in terms of tables and think about your models, e.g.

skills_you_want_to_display = Skill.all - user.skills

can you give me a practical sample…thanks

For more options, visit https://groups.google.com/groups/opt_out.

Werner L.
[email protected]

On Fri, Sep 21, 2012 at 8:46 AM, Werner L.
[email protected] wrote:

can you give me a practical sample…thanks

I just did :slight_smile:


Hassan S. ------------------------ [email protected]

twitter: @hassan

Am 21.09.2012 um 17:47 schrieb Hassan S.
[email protected]:

On Fri, Sep 21, 2012 at 8:46 AM, Werner L.
[email protected] wrote:

can you give me a practical sample…thanks

I just did :slight_smile:

This idea

Skill.all - user.skills

is totally new to me…
I will try tonight…ned some air now
Thanks so far

For more options, visit https://groups.google.com/groups/opt_out.

Werner L.
[email protected]

On Fri, Sep 21, 2012 at 8:54 AM, Werner L.
[email protected] wrote:

This idea

Skill.all - user.skills

is totally new to me…

Time to open up irb or a rails console and play around, e.g.

1.9.3p194 :014 > [1,2,3,4,5] - [1,2,3]
=> [4, 5]

Have fun!

Hassan S. ------------------------ [email protected]

twitter: @hassan

On Fri, Sep 21, 2012 at 12:17 PM, Mirri K. [email protected] wrote:

I won’t generally go with that approach:

  • Skill.all can get big
  • You’re doing 2 queries by default plus the array subtraction

I don’t think the two-queries part can be avoided. If Skill.all is
big, maybe something like:

Skill.where(“skills.id NOT IN ?”, user.skills.map(&:id))

Whatcha think?

-Dave


Dave A., Available Secret-Cleared Ruby/Rails Freelancer
(VA/DC/Remote);
see www.DaveAronson.com, www.Codosaur.us, and www.Dare2XL.com for more
info.

I won’t generally go with that approach:

  • Skill.all can get big
  • You’re doing 2 queries by default plus the array subtraction

It’s better to just use a scope or a class method on Skill or some
service
class in my opinion but for brevity nothing tops that. The results would
(should) be cached anyway.

On Fri, Sep 21, 2012 at 11:57 PM, Hassan S. <