2011-04-05 69 views
1

有人可以幫助我理解如何將此sql查詢轉換爲named_scope或者可能是一種方法?帶連接的Named_scope

背景:旅程可以有很多trip_runs。我想可以說TripRun.upcoming並返回從有效旅行基於以下查詢

SELECT r.* 
FROM trip_run r 
LEFT JOIN trips t 
ON r.trip_id = t.id 
WHERE r.starts_on > NOW() 
AND t.is_booked = 1 
AND t.is_cancelled IS NULL 

唯一有效的運行謝謝

+3

您使用導軌3還是導軌2? – 2011-04-05 22:07:55

回答

0

基於約書亞的答案,但對於軌道2.3:

class Trip < ActiveRecord::Base 
    has_many :trip_runs 
    named_scope :booked, :conditions => 'is_booked = 1 AND is_cancelled IS NULL' 
end 

class TripRun < ActiveRecord::Base 
    belongs_to :trip 
    named_scope :upcoming, :conditions => 'starts_on > NOW()' 
end 

Trip.booked.trip_runs.upcoming 

或者:

class Trip < ActiveRecord::Base 
    has_many :trip_runs 
end 

class TripRun < ActiveRecord::Base 
    belongs_to :trip 
    named_scope :upcoming, 
       :conditions => 'trip.is_booked = 1 AND trip.is_cancelled IS NULL 
           AND trip_runs.starts_on > NOW()', 
       :joins => :trip 
end 

TripRun.upcoming 

將使用一個INNER JOIN不是一個LEFT JOIN,但因爲你正在尋找的行將trip.is_booked設置爲非空值,結果將相同,並且查詢將不會變慢。

2

這裏假設你正在使用的Rails 3和AREL。編輯跳閘和TripRun模型文件,就像這樣:

class Trip < ActiveRecord::Base 
    has_many :trip_runs 
    scope :booked, where("is_booked = 1 and isnull(is_cancelled)") 

end 

class TripRun < ActiveRecord::Base 
    belongs_to :trip 
    scope :upcoming, where("starts_on > NOW()") 

end 

然後像這樣訪問:

Trip.booked.trip_runs.upcoming 

有很多方法可以混合和匹配這些模式來獲得類似的效果,創造方法來訪問數據。

+0

我正在使用2.3.5。我對named_scopes進行了語法調整,但是當我試圖像上面列出的那樣將它們鏈接在一起時,它不起作用。 – alassiter 2011-04-06 16:09:14

+0

我認爲你讓他們顛倒了。 '旅行'是'預訂'或'取消','TripRun'是'started_on'。 – 2011-04-06 16:36:09

+1

Alassiter ...這將需要Rails 3,我相信。 T,好點,哎呀。我會編輯。 – Joshua 2011-04-07 15:57:19