将关联的对象加入belongs_to对象

时间:2015-04-25 18:23:49

标签: ruby-on-rails ruby-on-rails-4 activerecord

我有Event模型有很多 DateEntry因为一个事件可以有多个日期时间

我有一个视图,我在那里看到所有具有特定日期日期条目的事件。我已经在 models / event.rb

中创建了这个类方法
def self.by_date(date)
  includes(:date_entries)
  .where(date_entries: { begins_at: date.beginning_of_day..date.end_of_day })
end

它运作正常。

现在在视图中我循环查看了我用该查询抓取的事件:

@events.each do |event|
  # whatever

我正在寻找一种方法来使用循环中所选DateEntry的日期。我想我必须使用ActiveRecords joins方法,但我已经尝试了很多方法,当我没有收到错误时输出仍然是相同的。

为了澄清,我想在循环中做类似event.selected_date_entry_by_the_by_date_method.begins_at之类的东西。

3 个答案:

答案 0 :(得分:1)

首先,在您的示例中,所有事件的日期都是相同的。您可以在控制器中轻松设置@date,然后在视图中使用它。

其次,看起来你应该反过来做事。您应该找到DateEntries并迭代这些事件,而不是找到事件。

答案 1 :(得分:0)

您的方法Event.by_date使用了includes,因此它急切地为您需要的事件加载date_entries。它会自动进行连接。在循环中只需

@events.each do |event|
  data_entries = event.date_entries
  # do something with the dates...
end

您的Event模型应该有has_many :date_entries

date_entries调用将返回该事件的所有日期,并且不会导致其他查询。

在rails控制台中运行此命令,您将看到正在运行的查询。

答案 2 :(得分:0)

你可以这样做,但我建议按照以下方式进行,这个类方法应该是范围甚至类方法,但是在DateEntry模型中:

class DateEntry < ActiveRecord::Base
  scope :by_date,->(date){ where(...)}
end

@events.each do |event|
 event.date_entries.by_date(date).each do |date_entry|
      # .....
 end
 # .....
end