ActiveRecord查询返回具有零个或多个关联模型的模型

时间:2014-05-21 22:58:21

标签: ruby-on-rails activerecord

我想查询课程并返回课程以及将来某个地方的所有事件,因此事件可能是[]或更多。

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,但似乎无法得到我追求的行为。

问题是当一个课程将来没有事件时,查询什么都不返回,而我仍然想要检索课程,即使它没有事件。

3 个答案:

答案 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)}