Ruby on rails 当日期不是:有很多关联时,如何最好地运行搜索?

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.days方法,即从Contact.start\u发送日期算起的天数

这意味着contact.start_date+email.days将生成电子邮件发送给联系人的日期

我想在这个日期前后使用link_,这样我就可以看到在那个日期安排的所有电子邮件和相关联系人

但是,这个“日期”不是属性或关联,所以我没有链接到模型的视图。这是经过计算的

因此:

1) URl中传递的日期的实际“格式”应该是什么?进行一致性转换的方法是什么

2) 我如何(找到)所有实例,因为这个“日期”不是一个实际属性,它是一个计算值,根据联系人和电子邮件的两个关联模型而变化

谢谢

编辑如下:

结果输出如下所示:

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的某个地方。这似乎是一种有趣的方法。。。