Rails LEFT OUTER JOIN with Subquery

时间:2015-04-04 10:09:35

标签: ruby-on-rails activerecord subquery

我有一个简单的日历应用程序。

型号:

class Day < ActiveRecord::Base
  self.primary_key = "sdate"
  has_many :items, foreign_key: :sdate
end

class Item < ActiveRecord::Base
  belongs_to :day, :foreign_key => :sdate
  belongs_to :calendar
end

class Calendar < ActiveRecord::Base
  has_many :items
end

要求: 获取特定日期范围内的所有行天数。 使用特定的Calendar-ID获取相关的项目行。

使用SQL我可以使用以下查询:

SELECT * FROM days LEFT OUTER JOIN (
  SELECT * FROM items
  WHERE calendar_id IN (1, 4)
) AS items
ON days.sdate = items.sdate
WHERE days.sdate BETWEEN '2015-03-01' AND '2015-03-31';

我在Rails中尝试了几种方法但我找不到解决方案。

如何在Rails 4中执行此操作?急切的加载会很棒。

2 个答案:

答案 0 :(得分:0)

这些方面的东西:

Day.joins('LEFT OUTER JOIN items ON days.sdate = items.sdate')
     .where('items.calendar_id IN (1, 4)')
     .where('days.sdate' => start_time..end_time)

http://guides.rubyonrails.org/active_record_querying.html

答案 1 :(得分:0)

我只想弄清楚这一点,我不知道用纯Rails做任何事情。但这会做你想要的:

Day.joins("LEFT OUTER JOIN (
  SELECT * FROM items
    WHERE calendar_id IN (1, 4)
  ) AS items
  ON days.sdate = items.sdate
  WHERE days.sdate BETWEEN '2015-03-01' AND '2015-03-31'");

我在代码中没有在查询中使用日期,因此我不确定您是否需要在日期周围使用单引号。但这就是语法。我认为Left连接非常方便,我希望Rails有一个实际的LEFT JOIN方法。