创建包含关联模型的命名范围

时间:2013-09-18 10:34:09

标签: ruby-on-rails ruby-on-rails-3

模型Organizer has_many events

Event具有begin_day:datepublished:boolean属性。

我对尚未发生的事件有以下查询:

@organizer.events.order('begin_day asc').where('begin_day >= ?', Date.today).where(published: true).limit(8)

我想将其扩展到范围,以便它实现如下:

@organizer.upcoming_events.limit(8)

如何创建此范围,但包含相关模型?

3 个答案:

答案 0 :(得分:1)

尝试这样的smth:

scope :upcoming_events, -> { joins(:events).where("events.begin_day >= ?", Date.today).where(events: {published: true}).order('events.begin_day asc') }

答案 1 :(得分:1)

has_manybelongs_to帮助程序会自动创建允许您加入两个模型的字段和范围,在用户定义的范围内,您必须手动加入这些模型。 ;)

class Event
  belongs_to :organizer
end

class Organizer
  has_many :events

  scope :upcoming_events, joins(:events).order('begin_day asc').where('begin_day >= ?', Date.today).where(published: true)

  # lol007's query
  scope :upcoming_events, -> { joins(:events).where("events.begin_day >= ?", Date.today).where(events: {published: true}).order('events.begin_day asc') }

  end
end

答案 2 :(得分:1)

在他的回答中阅读@Champ的推理,似乎只是在查询部分中粘贴方法同样有效。可连锁的。

class Event
  belongs_to :organizer
end

class Organizer
  has_many :events

  def upcoming_events
    self.events.order('begin_day asc').where('begin_day >= ?', Date.today).where(published: true)
  end       

  end
end

现在可以使用:

@organizer.upcoming_events.limit(8)