2012-07-13 159 views
0

比方說,我有以下型號:Rails的LEFT OUTER JOIN

class Employee < ActiveRecord::Base 
    has_many :shifts  
end 

class Shift < ActiveRecord::Base 
    belongs_to :employee 
end 

在我的控制器我想要加載的所有員工,包括其在一定日期範圍的變化。 但我也想包括那些沒有在這個範圍內變化的員工。

在我控制我的嘗試:

@employees.joins("LEFT OUTER JOIN shifts ON employees.id = shifts.employee_id").where('shifts.starts_at BETWEEN ? and ?', weekBegin, weekEnd).to_json(:include => :shifts) 

但是,這仍然只是在該日期範圍內的變化返回僱員。我還希望在該日期範圍內返回沒有班次的員工。

這樣的查詢如何工作?

回答

1

你可以嘗試這樣做,

LEFT OUTER JOIN shifts ON employees.id = shifts.employee_id AND shifts.starts_at BETWEEN weekBegin and weekEnd 
4

您應該包括在轉移條件開始時間到加入語句:

@employees.joins(" 
    LEFT OUTER JOIN shifts 
    ON employees.id = shifts.employee_id 
    AND shifts.starts_at 
     BETWEEN #{ActiveRecord::Base.sanitize(weekBegin)} 
      AND #{ActiveRecord::Base.sanitize(weekEnd)} 
").to_json(:include => :shifts) 
+0

謝謝看起來不錯。唯一的問題是它現在加載所有班次。不僅是日期範圍內的所有人。 – Ben 2012-07-13 12:10:06

+0

這很奇怪。你能檢查結果中產生了什麼SQL查詢嗎? – 2012-07-13 12:12:09

+0

其實不止一個。第一個似乎是正確的: – Ben 2012-07-13 12:14:22