El martes, 24 de abril de 2012 03:56:21 UTC+2, Rafael C. de Almeida 
escribió:
>
> Hello 
>
> I have two tables: Lawyer and Phone. Phone is separated into area code 
> and number. A lawyer has many phones. I want to produce a query which 
> searches for lawyers who have a phone matching a phone from a list of 
> phones. 
>
> If I had only one phone I could search it like this: 
>
>     Lawyer.join(:phones).where(:area_code => area_code, :number => 
> number) 
>
> The problem is that I have a list with more than one area code. So I 
> really want to do something like this: 
>
>     lawyers = [] 
>     phones.each { |phone| lawyers += 
> Lawyer.join(:phones).where(:area_code => phone[:area_code], :number => 
> phone[:number]) } 
>
> However, I don't want to make many queries. This is how I would do a 
> similar thing using SQL alone (assuming the list of numbers was 
> [{:area_code=>'555', :number=>'1234564'}, 
> {:area_code=>'533', :number=>'12345678'}]) 
>
>     select * from phones where (area_code, number) in (('555', 
> '1234564'), ('533', '12345678')) 
>
> How to translate that to ActiveRecord? 
>
> Cheers, 
> Rafael


Your best option is probably:  

Lawyer.includes(:phones).where( :phones => {:area_code => 
phone[:area_code], :number => 
phone[:number]}) }

Then you may iterate through phones at your will.

Using .includes() preloads related models, phones in this case, and 
subsequent queries do not actually query the db but the data structure 
stored in memory (you can easily check this in a console; with .includes() 
no 'select *...' will appear on the logs when accessing a lawyer's phones)

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/rubyonrails-talk/-/wnUcNmWqKooJ.
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-talk?hl=en.

Reply via email to