Rails 3:从has_many返回的assosiated记录中过滤

时间:2010-12-30 04:15:30

标签: ruby-on-rails ruby-on-rails-3 named-scope

我试图解释一些相当复杂的事情。或许比说起来更复杂。我有“事件”。这些事件属于“场地”。场馆模型中的场景 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?是为了。也许有帮助

1 个答案:

答案 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! 

(更干净?)