ActiveRecord关联和范围哦我的

时间:2012-10-23 17:10:44

标签: ruby-on-rails ruby activerecord associations scopes

我正在试图弄清楚如何从多个表中提取数据并理解它。

我有eventsoccurrencesvenues表。

以下是目前的模型/协会:

模型/ event.rb:

class Event < ActiveRecord::Base
 has_many :occurences, :dependent => :destroy
 belongs_to :price
 belongs_to :venue
 validates_presence_of :venue
end

模型/ venue.rb:

class Venue < ActiveRecord::Base
 has_many :events, :dependent => :destroy
end

模型/ occurence.rb:

class Occurence < ActiveRecord::Base
 belongs_to  :event
 scope :today, lambda { where("occurence.datetime_start <= ? AND datetime_end >= ?", Time.now.end_of_day, Time.now) }
 scope :this_week, lambda { where("occurence.datetime_start <= ? AND datetime_end <= ?", Time.now.end_of_day, Time.now.at_end_of_week) }
 scope :next_week, lambda { where("occurence.datetime_start > ? AND datetime_end < ?", Time.now.at_end_of_week, Time.now.at_end_of_week + 1.weeks) }
 scope :this_month, lambda { where("occurence.datetime_start <= ? AND datetime_end >= ?", Time.now.end_of_day, Time.now.at_end_of_month) }
 scope :next_month, lambda { where("occurence.datetime_start >= ? AND datetime_end <= ?", Time.now.at_beginning_of_month + 1.months, Time.now.at_end_of_month + 1.months) }
end

我希望在我的观点/ events / index.html.erb中显示的是今天发生的所有事件的表格,我喜欢这样做:

<% @events.today.each do |event|  %>

并显示与.today范围匹配的所有事件。

我尝试将范围移到event模型无济于事。我应该将范围移动到事件模型吗?到目前为止,我的搜索引导我 “Using scope to return results within multiple DateTime ranges in ActiveRecord” 和 “Multiple scope in rails 3.0”但我无法真正做出任何改变。

有人能指出我正确的方向吗?我应该在我的活动模型中创建一个新功能吗?

2 个答案:

答案 0 :(得分:3)

class Event < ActiveRecord::Base
  has_many :occurences, :dependent => :destroy
  belongs_to :price
  belongs_to :venue
  validates_presence_of :venue

  scope :today, lambda {
    joins(:occurences).where("datetime_start <= ? AND datetime_end >= ?", Time.now.end_of_day, Time.now)
  }
end

答案 1 :(得分:1)

如果您希望语法的工作方式如下:

@events.today

然后范围必须在Event模型中。

如果你没问题:

@event.occurences.today
那时你现在好了,即:

@events = Event.all
@events.each do |ev|
   ev.occurences.today.each do |oc|
   end
end