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.