我想查询课程并返回课程以及将来某个地方的所有事件,因此事件可能是[]或更多。
class Course < ActiveRecord::Base
has_many :events
scope :published_events, -> { where('events.starts > ?', Date.today).references(:events)}
class Event < ActiveRecord::Base
belongs_to :course
scope :live, -> { where('starts >= ?', Date.today)}
我尝试过Course.includes(:events).published_events和Course.join(:events).published_events,但似乎无法得到我追求的行为。
问题是当一个课程将来没有事件时,查询什么都不返回,而我仍然想要检索课程,即使它没有事件。
答案 0 :(得分:0)
查询是什么样的?我认为它会针对事件生成INNER JOIN
,这需要存在一行或多行。你想要一个LEFT OUTER JOIN
,这将允许返回没有事件的课程。
你可能需要试试这个:
Course.joins("LEFT OUTER JOIN events ON events.course_id = courses.id").published_events
答案 1 :(得分:0)
通过向课程live_events
添加另一个关系来解决此问题:
class Course < ActiveRecord::Base
has_many :events
has_many :live_events, -> { where('starts >= ?', Date.today)}, class_name:'Event'
并在我的查询中包括:
@course = Course.includes(:live_events).find(id)
不确定这是否是解决此特定问题的最佳方式,所以如果有更好的方法请告诉我
答案 2 :(得分:0)
如果您使用的是Rails 4:
class Course < ActiveRecord::Base
has_many :events
scope :published_events, -> { joins(:events).merge(Event.live) }
class Event < ActiveRecord::Base
belongs_to :course
scope :live, -> { where('starts >= ?', Date.today)}