Как лучше всего выполнить поиск по дате, когда она не является ассоциацией: has_many? - PullRequest
0 голосов
/ 27 апреля 2010

У меня есть ряд мероприятий, на которые рассчитана запланированная дата. Действия, например, Email, имеют метод email.days, который представляет собой дни от Contact.start_date, в которые он должен быть отправлен.

Это означает, что contact.start_date + email.days выдает дату отправки письма контактному лицу.

Я хотел бы использовать link_to вокруг даты, чтобы я мог видеть все электронные письма и связанные контакты, которые должны быть запланированы на эту дату.

Однако эта «дата» не является атрибутом или партнером, поэтому я не ссылаюсь на представление модели. Подсчитано.

Итак:

1) Каким должен быть фактический «формат» даты, которая передается в URl? Каков метод для последовательного преобразования?

2) Как мне (найти) все экземпляры, поскольку эта «дата» не является фактическим атрибутом, является ли она расчетным значением, которое изменяется в зависимости от двух связанных моделей Contact и Email.

Спасибо.

РЕДАКТИРОВАТЬ НИЖЕ:

Полученный результат будет выглядеть так:

Джон Джонс "Тема письма №1"

Дэйви Джонс "Тема письма № 2"

Франклин Рузвельтн "Тема письма № 1"

ETC ...

Ответы [ 2 ]

1 голос
/ 27 апреля 2010

Вы можете добавить индексный метод к вашему 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
0 голосов
/ 27 апреля 2010

В зависимости от того, хранятся ли эти атрибуты в глобальной конфигурации или определяются, или хранятся ли они в базе данных, вы можете выполнять математические операции в своем операторе SQL. Это самый быстрый способ.

В противном случае вы можете сделать что-то вроде этого:

Email.find(:all).reject { |email| email.contact.start_date + email.days <= Date.now }

Очевидно, мне не хватает некоторых деталей о вашей модели данных, но, надеюсь, это даст вам представление о том, как легко фильтровать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...