[LRUG] Named Scope Problem
Andrew Stewart
boss at airbladesoftware.com
Wed Oct 14 08:13:50 PDT 2009
Hi El Rug,
I have a typical subdomain-based Rails app where the subdomain
corresponds to an account. The rest of my models hang off the
account; the longest chain is five models long:
Account -> A -> B -> C -> D -> E # "->" means has many.
I'm trying to write named_scopes for each class which restrict
instances to the top-level account instance of the current user. They
seem to work but they:
(a) generate left outer joins instead of the inner joins I would
expect; and
(b) generate two joins per relation instead of one.
For example, my E class looks like:
class E < ActiveRecord::Base
named_scope :silo, lambda { |account_id|
{
:select => 'distinct e.*',
:joins => {:d => {:c => {:b => {:a => :account}}}},
:conditions => {:d => {:c => {:b => {:a => {:account => {:id
=> account_id}}}}}},
}
}
end
And E.silo(6), for example, produces:
SELECT distinct e.* FROM `e`
LEFT OUTER JOIN `d` ON `d`.id = `e`.d_id
LEFT OUTER JOIN `c` ON `c`.id = `d`.c_id
LEFT OUTER JOIN `b` ON `b`.id = `c`.b_id
LEFT OUTER JOIN `a` ON `a`.id = `v`.a_id
LEFT OUTER JOIN `accounts` ON `accounts`.id = `a`.account_id
LEFT OUTER JOIN `d` d_e ON `d_e`.id = `e`.d_id
LEFT OUTER JOIN `c` c_d ON `c_d`.id = `d_e`.c_id
LEFT OUTER JOIN `b` b_c ON `b_c`.id = `c_d`.b_id
LEFT OUTER JOIN `a` a_b ON `a_b`.id = `b_c`.a_id
LEFT OUTER JOIN `accounts` a2 ON `a2`.id = `a_b`.account_id
WHERE (`accounts`.`id` = 6)
(I may have made a typo somewhere in anonymising this ;)
Anyway, how to get ActiveRecord to use the more efficient and correct
inner join, and how to avoid the duplicating of joins?
Thanks in advance,
Andy Stewart
--------
http://airbladesoftware.com
More information about the Chat
mailing list