Rails 3: фильтр из связанных записей, возвращаемых has_many - PullRequest
0 голосов
/ 30 декабря 2010

Я пытаюсь объяснить что-то довольно сложное.Возможно, сложнее сказать, чем сделать.У меня есть «события».Эти события относятся к «местам проведения».Таким образом, события have_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 Ответ

1 голос
/ 30 декабря 2010

Вам необходимо изменить:

<% @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, то вы можете изменить область действияиз:

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! 

(намного чище?)

...