Я нуждаюсь в помощи, осуществляя рефакторинг эту многоконтурную вещь. Вот то, что я имею:
Кампания has_many Контакты
Кампания также имеет много Моделей, которые являются шаблонами: (электронная почта, Вызов и Буква).
Поскольку я ищу запоздалый на каждом, я создал массив под названием Событие, которое я хотел бы циклично выполнить через это, содержит ['электронную почту', 'звоните', 'буква'].
Мне нужен список всех электронных писем, Вызовов и Букв, которые являются "запоздалыми" для каждого Контакта, который принадлежит Кампании. Запоздалый определяется from_today методом, который смотрит на дату, Контакт вводился в систему и количество дней, которое должно передать для любого данного События. from_today () производит количество дней с сегодняшнего дня, что Событие должно быть сделано для данного Контакта.
Вот то, что я сделал, это работает на все электронные письма в Кампании через все контакты. Я собирался попытаться создать другого, каждый действительно циклично выполняется для изменения имен классов.
Не было уверено, где начать: named_scope, продвиньте некоторые вещи в метод, и так далее, или - минимум мочь динамично изменить имена классов так, по крайней мере, он циклично выполняется три раза через различные события вместо того, чтобы повторить код три раза:
<% @campaigns.each do |campaign| %>
<h2><%= link_to campaign.name, campaign %></h2>
<% @events.each do |event| %>
<%= event %>
<% for email in campaign.emails %>
<h4><%= link_to email.title, email %> <%= email.days %> days</h4>
<% for contact in campaign.contacts.find(:all, :order => "date_entered ASC" ) %>
<% if (from_today(contact, email.days) < 0) %>
<% if show_status(contact, email) == 'no status'%>
<p> <%= full_name(contact) %>
is <%= from_today(contact,email.days).abs%> days overdue:
<%= do_event(contact, email) %>
</p>
<% end %>
<% end %>
<% end %>
<% end %>
<% end %>
<% end %>
Чтобы добавить к ответу Патрика, я бы также использовал параметр: collection render
, чтобы упростить это немного дальше, например иметь частичный _contact.html.erb для рендеринга каждого контакта:
<% if (from_today(contact, email.days) < 0) %>
<% if show_status(contact, email) == 'no status'%>
<p> <%= full_name(contact) %>
is <%= from_today(contact,email.days).abs%> days overdue:
<%= do_event(contact, email) %>
</p>
<% end %>
<% end %>
<% end %>
, а затем рендерить коллекцию contacts
с помощью
= render :partial => "contact", :collection => @contacts
. Я также не стал бы искать в представлении, вместо этого я бы настроил все переменные в контроллере и, возможно, переместите весь условный код в помощник. Желательно, чтобы в представлениях было как можно больше логики.
Я бы поместил вывод для каждого ресурса в partial, примерно так:
<% @campaigns.each do |campaign| %>
<h2><%= link_to campaign.name, campaign %></h2>
<%= render 'events', :events => campaign.events %>
<% end %>
затем в app/views/campaigns/_events.html.erb
<% events.each do |event| %>
<%= event %>
<%= render 'emails', :emails => event.emails %>
<% end %>
затем в app/views/campaigns/_emails.html. erb
<% emails.each do |email| %>
<h4><%= link_to email.title, email %> <%= email.days %> days</h4>
<%= render 'contacts', :contacts => email.contacts.all(:order => "date_entered ASC", :email => email) %>
<% end %>
затем в app/views/campaigns/_contacts.html.erb
<% contacts.each do |contact| %>
<% if (from_today(contact, email.days) < 0) %>
<% if show_status(contact, email) == 'no status'%>
<p> <%= full_name(contact) %>
is <%= from_today(contact,email.days).abs%> days overdue:
<%= do_event(contact, email) %>
</p>
<% end %>
<% end %>
<% end %>