2012-10-23 61 views
2

我试图找出如何从多个表中提取数据,并使得它的意义。ActiveRecord关联和范围噢,我的

我有events,occurrencesvenues表。

下面是模型/协会至今:

型号/ 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 

我会LIK E在我看来/事件/ 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”,但我真的不能做任何事情出来。

任何人都可以指向正确的方向吗?我应该在我的事件模型中创建一个新功能吗?

回答

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 
+0

我发现,经过进一步的测试,那上面范围返回多个相同的事件(每个事件有多少匹配的事件)。即使许多事件与范围匹配,我也希望事件只返回一次。如何才能做到这一点? 实施例:事件有很多出现整个月(说10)的所述@events = Event.all输出将产生该事件的10个条目。 –

+0

你可以尝试链接一。选择(“独特的'events'。*”)的范围内的值。 –

+0

你先生,是亲。奇迹般有效。 –

1

如果你希望你的语法的工作,如:

@events.today 

那么范围将必须在Event模型。

如果你确定有:

@event.occurences.today 

那么你现在就好了,即:

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