ActiveRecord named_scope коллизии
среда, 17 марта, 2010BDSM.active_advisor.for_customer(123456)
если
named_scope :active_advisor,
:joins => 'INNER JOIN listings l ON (l.id = favorite_listings.listing_id)
INNER JOIN users u ON (u.id = l.user_id)',
:conditions => ['u.status = ?', User::Status::ACTIVE]
named_scope :for_customer, lambda{|customer_id| {
:joins => 'INNER JOIN listings l ON (l.id = favorite_listings.listing_id)
LEFT JOIN customers c ON (c.user_id = l.user_id AND c.customer_id = favorite_listings.user_id)',
:conditions => "l.user_id = #{customer_id}"}}
а получится кака с alias -ами и extra join
Mysql::Error: Not unique table/alias: 'l':
SELECT `favorite_listings`.* FROM `favorite_listings`
INNER JOIN listings l ON (l.id = favorite_listings.listing_id)
LEFT JOIN customers c ON (c.user_id = l.user_id AND c.customer_id = favorite_listings.user_id)
INNER JOIN listings l ON (l.id = favorite_listings.listing_id)
INNER JOIN users u ON (u.id = l.user_id)
WHERE ((l.user_id = 123456) AND (u.status = 1))
решается начиная с rails 2.2 (патч тут)
:joins с 2+ джойнами заменяем на массив джойнов, и activerecord здесь делает uniq
named_scope :active_advisor,
:joins => ['INNER JOIN listings l ON (l.id = favorite_listings.listing_id)',
'INNER JOIN users u ON (u.id = l.user_id)'],
:conditions => ['u.status = ?', User::Status::ACTIVE]
named_scope :for_customer, lambda{|customer_id| {
:joins => ['INNER JOIN listings l ON (l.id = favorite_listings.listing_id)',
'LEFT JOIN customers c ON (c.user_id = l.user_id AND c.customer_id = favorite_listings.user_id)'],
:conditions => "l.user_id = #{customer_id}"}}
на выходе вменяемый SQL без лишних джойнов
SELECT `favorite_listings`.* FROM `favorite_listings`
INNER JOIN listings l ON (l.id = favorite_listings.listing_id)
LEFT JOIN customers c ON (c.user_id = l.user_id AND c.customer_id = favorite_listings.user_id)
INNER JOIN users u ON (u.id = l.user_id) WHERE ((l.user_id = 123456) AND (u.status = 1))

