Rails 带子查询的 LEFT OUTER JOIN
Rails LEFT OUTER JOIN with 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
要求:
获取特定日期范围内的所有天数行。
获取具有特定日历 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 中执行此操作?预加载会很棒。
大致如下:
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)
我只是想解决这个问题,但我不知道有什么方法可以用纯 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 方法。
我有一个简单的日历应用程序。
型号:
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 中执行此操作?预加载会很棒。
大致如下:
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)
我只是想解决这个问题,但我不知道有什么方法可以用纯 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 方法。