【问题标题】:Rails LEFT OUTER JOINRails 左外连接
【发布时间】:2012-07-13 11:32:32
【问题描述】:

假设我有以下模型:

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)

但这仍然只是返回在该日期范围内有班次的员工。我还想退回该日期范围内没有轮班的员工。

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

【问题讨论】:

    标签: sql ruby-on-rails ruby-on-rails-3 activerecord join


    【解决方案1】:

    您应该将班次开始时间的条件包含在连接语句中:

    @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)
    

    【讨论】:

    • 谢谢,看起来不错。唯一的问题是它现在加载所有班次。不仅是日期范围内的,而且是所有的。
    • 这很奇怪。你能检查结果中生成了什么 SQL 查询吗?
    • SELECT "employees".* FROM "employees" LEFT OUTER JOIN shifts ON employees.id = shifts.employee_id AND shifts.starts_at BETWEEN '2012-07-09 00:00:00.000000' AND '2012 -07-15 23:59:59.999999' WHERE "employees"."company_id" = 1 ORDER BY lastname asc, firstname asc LIMIT 25 OFFSET 0
    • 然后还有 4 个:轮班负载 (0.3 毫秒) SELECT "shifts".* FROM "shifts" WHERE "shifts"."employee_id" = 3 轮班负载 (0.2 毫秒) SELECT "轮班"。 * FROM "班次" WHERE "班次"."employee_id" = 4 班次负荷 (0.2ms) SELECT "班次".* FROM "班次" WHERE "班次"."employee_id" = 2 班次负荷 (0.2ms) SELECT "班次".* FROM "班次" WHERE "班次"."employee_id" = 1
    • 嗯,BETWEEN 部分的时间格式看起来很可疑。您使用的是什么数据库,您是否在 WHERE 子句中获得了与原始查询相同的时间格式?否则,生成的查询看起来不错。
    【解决方案2】:

    你可以试试

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

    【讨论】:

      猜你喜欢
      • 2018-08-21
      • 1970-01-01
      • 2014-08-13
      • 2011-10-01
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 2014-02-24
      相关资源
      最近更新 更多