Вы можете добавить индексный метод к вашему EmailsController:
class EmailsController < ApplicationController
def index
@contact_emails = ContactEmail.all(:include => [:contact, :email],
:conditions => ["contacts.created_at <= DATE_SUB(?, INTERVAL
emails.days DAY)",
params[:due_date])
# now you can access the email as
# contact_email.email
# contact_email.contact
end
end
Ссылка на дату окончания:
link_to("Due today", emails_path(:due_date => Date.today))
Редактировать 1
Чтобы получить список рассылок, которые должны быть отправлены сегодня:
def index
@emails = Emails.all(:conditions => [ " EXISTS (
SELECT *
FROM contacts A
WHERE A.start_date = DATE_SUB(?,
INTERVAL emails.days DAY)
)", params[:due_date].to_date)
end
В приведенном выше запросе ожидается, что start_date
будет полем Date
.
Редактировать 2
Запрос на возврат данных из контакта и электронной почты:
def index
joins = Contact.send(:sanitize_sql_array,
["JOIN emails AS emails ON contacts.start_date =
DATE_SUB(?, INTERVAL emails.days DAY)",
params[:due_date].to_date
])
@contacts = Contact.all(:joins => joins,
:select => "contacts.*, emails.subject AS email_subject")
end
Теперь вы можете перебирать контакты
@contacts.each do |contact|
contact.first_name #John
contact.last_name #Clive
contact.email_subject #Subject 1
end
Если вам нужно больше полей из электронных писем, добавьте их в предложение :select
(аналогично subject
).
Редактировать 3
Я дополнительно оптимизировал решение:
def index
joins = Contact.send(
@contacts = Contact.all(:joins => "JOIN emails AS emails",
:select => "contacts.*, emails.subject AS email_subject",
:conditions => ["contacts.start_date =
DATE_SUB(?, INTERVAL emails.days DAY)",
params[:due_date].to_date
]
)
end