Rails LEFT OUTER JOIN子查询
问题描述:
我有一个简单的日历应用程序。Rails LEFT OUTER JOIN子查询
型号:
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
要求: 一定时间范围内获取的天所有行。 获取与某些日历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中做到这一点?急切的加载会很好。
答
我只是想弄清楚这一点,我不知道任何方式与纯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'");
我不会在我的代码查询使用日期,所以我不知道,如果你需要的日期或周围没有单引号。但这是语法。我认为左连接非常方便,我希望Rails有一个实际的LEFT JOIN方法。
答
东西沿着这些路线:
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)
那些听起来像2个不同的要求,他们? – 2015-04-04 10:14:46