Rails LEFT OUTER JOIN

时间:2012-07-13 11:32:32

标签: sql ruby-on-rails ruby-on-rails-3 activerecord 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)

但是这仍然只会让那些日期范围内的员工回归。我还希望让那些日期范围内没有班次的员工回归。

这样的查询是如何工作的?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

您可以尝试这样做

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