Forum: Ruby on Rails Set a query filter

Posted by Werner (Guest)
on 2012-09-21 11:49
(Received via mailing list)
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..
Posted by Hassan Schroeder (Guest)
on 2012-09-21 17:41
(Received via mailing list)
On Fri, Sep 21, 2012 at 2:48 AM, Werner 
<webagentur.laude@googlemail.com> 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 Schroeder ------------------------ hassan.schroeder@gmail.com
http://about.me/hassanschroeder
twitter: @hassan
Posted by Werner Laude (Guest)
on 2012-09-21 17:47
(Received via mailing list)
Am 21.09.2012 um 17:40 schrieb Hassan Schroeder 
<hassan.schroeder@gmail.com>:

> On Fri, Sep 21, 2012 at 2:48 AM, Werner <webagentur.laude@googlemail.com> 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 Laude
webagentur.laude@gmail.com
Posted by Hassan Schroeder (Guest)
on 2012-09-21 17:49
(Received via mailing list)
On Fri, Sep 21, 2012 at 8:46 AM, Werner Laude
<webagentur.laude@googlemail.com> wrote:

> can you give me a practical sample..thanks

I just did  :-)

--
Hassan Schroeder ------------------------ hassan.schroeder@gmail.com
http://about.me/hassanschroeder
twitter: @hassan
Posted by Werner Laude (Guest)
on 2012-09-21 17:55
(Received via mailing list)
Am 21.09.2012 um 17:47 schrieb Hassan Schroeder 
<hassan.schroeder@gmail.com>:

> On Fri, Sep 21, 2012 at 8:46 AM, Werner Laude
> <webagentur.laude@googlemail.com> wrote:
>
>> can you give me a practical sample..thanks
>
> I just did  :-)

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 Laude
webagentur.laude@gmail.com
Posted by Hassan Schroeder (Guest)
on 2012-09-21 17:59
(Received via mailing list)
On Fri, Sep 21, 2012 at 8:54 AM, Werner Laude
<webagentur.laude@googlemail.com> 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 Schroeder ------------------------ hassan.schroeder@gmail.com
http://about.me/hassanschroeder
twitter: @hassan
Posted by Mirri Kim (Guest)
on 2012-09-21 18:18
(Received via mailing list)
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 Schroeder <
Posted by Dave Aronson (Guest)
on 2012-09-21 20:06
(Received via mailing list)
On Fri, Sep 21, 2012 at 12:17 PM, Mirri Kim <mirri.kim@gmail.com> 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 Aronson, Available Secret-Cleared Ruby/Rails Freelancer 
(VA/DC/Remote);
see www.DaveAronson.com, www.Codosaur.us, and www.Dare2XL.com for more 
info.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.