【问题标题】:ActiveRecord associations and scopes oh myActiveRecord 关联和范围哦,我的
【发布时间】:2012-10-13 16:46:09
【问题描述】:

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

我有 eventsoccurrencesvenues 表。

以下是迄今为止的模型/协会:

models/event.rb:

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

models/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

我想在 view/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" 但我真的无法从中得到任何东西。

谁能指出我正确的方向?我应该在我的事件模型中创建一个新函数吗?

【问题讨论】:

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


    【解决方案1】:
    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
    

    【讨论】:

    • 经过进一步测试,我发现上述范围正在返回多个相同的事件(与每个事件匹配的事件一样多)。即使许多事件与范围匹配,我也希望事件只返回一次。如何才能做到这一点?示例:一个事件在一个月内发生了很多次(比如 10 次),@events = Event.all 输出将为该事件生成 10 个条目。
    • 您可以尝试将 .select("distinct events.*") 链接到范围的值。
    • 您先生,是专业人士。像魅力一样工作。
    【解决方案2】:

    如果你想让你的语法像这样工作:

    @events.today
    

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

    如果你同意:

    @event.occurences.today
    

    那么你现在可以了,即:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多