2012-07-13 135 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