2011-08-11 32 views
0

在將我們的rails2應用程序遷移到rails3時,我們遇到了(另一種!)細微差別。就個人而言,它看起來像加入生成的SQL是錯誤的。Rails 3連接vs Rails 2的區別

給定一個模型,看起來像這樣:

class Event < ActiveRecord::Base 
    has_many :event_event_categories 
    has_many :locations, :class_name => "LocationCategory", :through => :event_event_categories, :source => :event_category, :uniq => true 
    ... 
end 

我們做一些示波器需要使用位置的一些列。但查詢是Rails中2比軌道微妙的不同3根

梁2:

ree-1.8.7-2011.03 :037 > Event.joins(:locations).to_sql 
=> "SELECT `events`.* FROM `events` 
     INNER JOIN `event_event_categories` ON (`events`.`id` = `event_event_categories`.`event_id`) 
     INNER JOIN `event_categories` ON (`event_categories`.`id` = `event_event_categories`.`event_category_id`) AND (`event_categories`.`type` = 'LocationCategory') " 

的Rails 3:

ree-1.8.7-2011.03 :037 > Event.joins(:locations).to_sql 
=> "SELECT `events`.* FROM `events` 
    INNER JOIN `event_event_categories` ON `events`.`id` = `event_event_categories`.`event_id` 
    INNER JOIN `event_categories` ON `event_categories`.`type` = 'LocationCategory'" 

它不把

(`event_categories`.`id` = `event_event_categories`.`event_category_id`) 

進入SQL。

這是爲什麼?

+0

梁2應該像'Event.all(:加入=>:位置)',嗯?並且沒有'to_sql'方法 – fl00r

+0

對不起 - 我正在使用fake_arel gem來獲取那些東西。 – phil

回答

0

在Rails3中您可以使用查詢,如

@alternative_drugs = Claim.joins('left join drugs on claims.ndc = drugs.ndcupchri ').select('claims.id, claims.member_id, claims.ndc').where("claims.nabp in ('1','2')").group(:ndc).order('calculated_price asc').all