我试图解释一些相当复杂的事情。或许比说起来更复杂。我有“事件”。这些事件属于“场地”。场馆模型中的场景 has_many 。
但事件很复杂,并且可以确定事件是过去,现在还是未来。获得正确事件(未来或仅存在)的范围是:
scope :not_over_or_in_progress, lambda { where("start_date < ? AND end_date > ? OR end_date IS NULL AND start_date > ? OR end_date IS NOT NULL AND start_date > ? OR start_date = ? OR end_date = ?", Date.today, Date.today, Date.today, Date.today, Date.today, Date.today) }
scope :valid, (not_over_or_in_progress.active).order("start_date ASC")
不是很漂亮,但工作正常。现在,当我展示场地时,我可以通过以下方式获得相关活动:
<% @venue.events.each do |event| %>
<li><%= event.title %> - (<%= event.event_status? %>)</li>
<% end %>
我得到所有活动,无论是过去,现在还是未来。它不会返回@ events.valid,而是@ events.all(所有这些)。 我想通过我的助手(event_status?)获取由我的范围(有效)过滤的关联事件。这可能吗?
我得到了一些助手,以确定事件是否结束。那是event_status?是为了。也许有帮助
答案 0 :(得分:1)
您需要改变:
<% @venue.events.each do |event| %>
<li><%= event.title %> - (<%= event.event_status? %>)</li>
<% end %>
成:
<% @venue.events.valid.each do |event| %>
<li><%= event.title %> - (<%= event.event_status? %>)</li>
<% end %>
您也可能想知道,如果您使用meta-where
gem,则可以从以下位置更改范围:
scope :not_over_or_in_progress, lambda { where("start_date < ? AND end_date > ? OR end_date IS NULL AND start_date > ? OR end_date IS NOT NULL AND start_date > ? OR start_date = ? OR end_date = ?", Date.today, Date.today, Date.today, Date.today, Date.today, Date.today) }
成:
scope :not_over, lambda { where(:start_date <= Date.today, :end_data >= Date.today) | where(:start_date = Date.today, :end_date => nil)}
将其放入初始值设定项
MetaWhere.operator_overload!
(更干净?)