2010-05-07 2 views
1

Есть модель под названием contact_email.date_sentКак использовать .find последние пять дней в рубине на рельсах?

Я хочу, чтобы иметь возможность запускать отчет, который отображает все те, где диапазон date_sent между date.today и date.today 5 дней назад.

Я предполагаю, что я использую что-то вроде

@send_emails = Contact_Email.find(:conditions=> ???) 

Но не ясно, что именно это лучший способ. Благодаря!

ответ

1

Попробуйте это:

ContactEmail.all(:conditions => ["date_sent >= ?", 5.days.ago.to_date]) 

Этот подход быстрее, чем при использовании BETWEEN положение (в предположении, date_sent индексируется)

Оговорка:

Значение date_sent колонки должны быть меньше чем текущая дата.

Edit 1

Для добавления индекса миграции:

add_index :contact_emails, :date_sent 
+0

Можно ли сделать так, чтобы я мог получить то, что было отправлено с понедельника по пятницу недели, которое Date.today? – Angela

+0

HOw Я создаю переход для добавления date_sent в качестве индекса (date_sent alrady существует, но не был установлен как индекс)? – Angela

+0

Обновлен ответ, посмотрите. –

1

ContactEmail.find(:conditions => ['date_sent BETWEEN ? AND ?', Date.today, 5.day.ago.to_date])

+0

Вы также можете просто использовать>, поскольку, предположительно, ваша база данных не содержит электронных писем из будущего. – bnaul

+0

Правильно, но это условие помогает найти вещи в ретроспективе. – Eimantas

0

Если это то, что вы будете использовать регулярно, почему бы не поставить named_scope в модели:

named_scope :recent, lambda { |*args| {:conditions => ["date_sent > ?", (args.first || 5.days.ago)]} } 

который позволит вам написать:

ContactEmail.recent 

за последние 5 дней стоит, или используйте arg, чтобы указать свой собственный временной интервал, например. за последние две недели:

ContactEmail.recent(2.weeks.ago) 
+0

Мне понравилась эта идея ... Мне нужно освежиться на named_scope, хотя ... – Angela

Смежные вопросы