Ruby on rails 当日期不是:有很多关联时,如何最好地运行搜索?
我有很多活动都有一个计划好的日期。这些活动(例如电子邮件)有一个Email.days方法,即从Contact.start\u发送日期算起的天数 这意味着contact.start_date+email.days将生成电子邮件发送给联系人的日期 我想在这个日期前后使用link_,这样我就可以看到在那个日期安排的所有电子邮件和相关联系人 但是,这个“日期”不是属性或关联,所以我没有链接到模型的视图。这是经过计算的 因此: 1) URl中传递的日期的实际“格式”应该是什么?进行一致性转换的方法是什么 2) 我如何(找到)所有实例,因为这个“日期”不是一个实际属性,它是一个计算值,根据联系人和电子邮件的两个关联模型而变化 谢谢 编辑如下: 结果输出如下所示:Ruby on rails 当日期不是:有很多关联时,如何最好地运行搜索?,ruby-on-rails,datetime,Ruby On Rails,Datetime,我有很多活动都有一个计划好的日期。这些活动(例如电子邮件)有一个Email.days方法,即从Contact.start\u发送日期算起的天数 这意味着contact.start_date+email.days将生成电子邮件发送给联系人的日期 我想在这个日期前后使用link_,这样我就可以看到在那个日期安排的所有电子邮件和相关联系人 但是,这个“日期”不是属性或关联,所以我没有链接到模型的视图。这是经过计算的 因此: 1) URl中传递的日期的实际“格式”应该是什么?进行一致性转换的方法是什么
Email.find(:all).reject { |email| email.contact.start_date + email.days <= Date.now }
约翰·约翰斯“电子邮件主题1”
戴维·琼斯“电子邮件主题2”
Franklin Rooseveltn“电子邮件主题1”
等等。根据这些属性是否存储在全局配置或定义中,或者它们是否存储在数据库中,您可以在SQL语句中进行计算。这是最快的方法 否则,您可以执行以下操作:
Email.find(:all).reject { |email| email.contact.start_date + email.days <= Date.now }
Email.find(:all).拒绝{| Email | Email.contact.start|u date+Email.days您可以向电子邮件控制器添加索引方法:
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
编辑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\u 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
子句(类似于主题
)
编辑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
嗨,为什么有两个链接到方法?第二个链接做什么不起作用?嗨,这只在创建了contacdt_电子邮件后才起作用…但现在它在计划之前不会被创建。电子邮件模式是“模板”可以这么说,需要在预定的时间发送…两个链接到
的方法是复制+粘贴错误。我已经修复了回复。你能再描述一下功能吗?电子邮件和联系人之间的链接是什么?更新了答案。看一看。嗨,正在尝试实现你的,丢失了拒绝方法和块…你能告诉我吗RTFM的某个地方。这似乎是一种有趣的方法。。。