Forum: Ruby on Rails using "find" when you have 2 has_many relations

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
5eb7dc9121bd474726f9f5568c9573ed?d=identicon&s=25 Per Djurner (pernod)
on 2006-01-17 16:31
An Account has_many Websites which in turn has_many WebsiteDomains

Now I can of course do this:
@domains = Account.find(1).websites.find(1).website_domains.find(:all)
To get all the domains for Account with id 1 and Website with id 1.

I would like to do something like this though:
@domains =
Account.find(1).websites.find(:all).website_domains.find(:all)
IE, get ALL domains for all websites in Account 1
The code above doesn't work because of the multiple find(:all)

I could do it using :joins and :conditions I guess but then I lose other
useful stuff like attributes matching column names in the database.

Any ideas?
Cb610750ee94ca103aef4b2dc7b1b768?d=identicon&s=25 Nick Stuart (Guest)
on 2006-01-17 16:46
(Received via mailing list)
@domains = Domain.find(:all, :conditions => ["websites.id = ? AND
websites.account_id = ?", website_id, acount_id], :include => "website")

Should do it. May need to be tweaked a little.

-Nick
5eb7dc9121bd474726f9f5568c9573ed?d=identicon&s=25 Per Djurner (pernod)
on 2006-01-17 17:13
Oops, I forgot that I actually had one more relation that has to go in
there.
Watcher belongs_to WebsiteDomain.

So what I really would like to do is something like this:

@watcher = Watcher.find(:all, :conditions => [websites.account_id = ?",
acount_id], :include => ["website_domain", "website"])

This does not work however and I just found this on the RoR API site:
"Itâ??s currently not possible to use eager loading on multiple
associations from the same table."

Is that why I can not do this?

If so, any work-arounds for it?
Cb610750ee94ca103aef4b2dc7b1b768?d=identicon&s=25 Nick Stuart (Guest)
on 2006-01-17 19:31
(Received via mailing list)
I guess it comes down to what you are looking for in the final results.
Whats the end goal? A list of domains per watcher? per website? per
account?
Need some more info to be able to refine it a bit more.

-Nick
5eb7dc9121bd474726f9f5568c9573ed?d=identicon&s=25 Per Djurner (pernod)
on 2006-01-17 19:38
The goal is to get all Watchers for one Account.
So my main problem is that since I have so many relations (Account -->
Websites --> WebsiteDomains --> Watchers) in between those two I'm not
sure how to code it in any elegant way.

Thanks for your help, really appreciate it!
58c44a4a506d878f9a112f1d7b7cb87e?d=identicon&s=25 Jeremy Evans (Guest)
on 2006-01-17 20:44
(Received via mailing list)
On 1/17/06, Per Dj <per.djurner@gmail.com> wrote:
> "It's currently not possible to use eager loading on multiple
> associations from the same table."
>
> Is that why I can not do this?

Because Rails wasn't designed with it in mind (it doesn't alias tables
in the SQL), and patches to implement it have been rejected (see
http://dev.rubyonrails.org/ticket/1562).

> If so, any work-arounds for it?

There's the Allow Multiple Associations Same Table plugin:
http://wiki.rubyonrails.org/rails/pages/Allow+Mult...,
which is a conversion of the latest patch in the ticket mentioned
above.
5eb7dc9121bd474726f9f5568c9573ed?d=identicon&s=25 Per Djurner (pernod)
on 2006-01-17 22:49
That's a surprise :O
Thanks for the info.

So if I want to avoid plugins and engines etc then my only choice is to
raw sql with find_by_sql ?
Cb610750ee94ca103aef4b2dc7b1b768?d=identicon&s=25 Nick Stuart (Guest)
on 2006-01-18 03:52
(Received via mailing list)
Looks to be the easiest way yes, but its not to painful is it?

Watcher.find_by_sql(["SELECT w.* FROM watchers w LEFT JOIN
website_domains ON website_domains.id = w.website_domain_id LEFT JOIN
websites ON websites.id = website_domains.website_id WHERE
websites.account_id = ?", account_id])

Should do it if I got the table/column names right...
5eb7dc9121bd474726f9f5568c9573ed?d=identicon&s=25 Per Djurner (pernod)
on 2006-01-18 07:43
> Looks to be the easiest way yes, but its not to painful is it?
No, not too painful :)
Thanks for your help!
This topic is locked and can not be replied to.