Take a look at ARel and Squeel gem. Squeel gem supports something like this
already.

On Wed, Aug 8, 2012 at 12:05 PM, Rafael Almeida <[email protected]>wrote:

> Hello.
>
> Let's say I have the following schema
>
>     People <---> people_services <---> services
>
> That is, people has a many-to-many relationship with services. Say I want
> to find all people who has services of types 1 and 2. How can we do it on
> activerecord today?
>
> My best solution so far is this
>
>     people_query = Person.joins(:services)
>     people = []
>     [1,2].each do |t|
>         people << people_query.where(:type => 1)
>     end
>     people = people.reduce(:&)
>
> That's not so good because by doing reduce(:&) you're exiting activerecord
> domain. So you wouldn't be able to do something like
> people.reduce(:&).limit(10). Also, that way I'm loading a lot more data
> than I actually need in my application memory. So, certainly not optimal
> solution.
>
> It's possible to make such query in SQL alone, if the dbms supports
> INTERSECTION then doing it is straightforward. If it doesn't, it's still
> possible using joins on subqueries.
>
> I think activerecord ought support such query and I'm willing to take my
> time and write the code for it. However, I'd like someone to help me out
> with it a bit. I don't understand rails or activerecord code base so well.
> Anyway, it would be best if I did a gem that introduces that feature into
> activerecord. Can anyone tell me what should I look up? A high level
> description of what I must do would be great. Something like "You'll need
> to create a gem, monkey patch this activerecord class, probably use this
> and this function to help you writing your SQL" would be nice.
>
> Cheers
>
> --
> You received this message because you are subscribed to the Google Groups
> "Ruby on Rails: Core" group.
> To view this discussion on the web visit
> https://groups.google.com/d/msg/rubyonrails-core/-/jz3f6lJrXEkJ.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/rubyonrails-core?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-core?hl=en.

Reply via email to