我有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
之类的东西。
答案 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