Используйте активную запись, чтобы найти запись по месяцу и дню, игнорируя год и время - PullRequest
3 голосов
/ 18 августа 2011

У меня есть модель (Записи) с записями за пять лет (одна запись в день). Мне нужен метод, который при передаче объекта даты, такого как 2011-12-25 00:00:00, будет показывать ВСЕ записи, которые произошли 12/25 (запрос к столбцу :created_at), независимо от года или времени, которое прошло.

RoR 3.0.9 / Ruby 1.9.2p290

Ответы [ 4 ]

12 голосов
/ 18 августа 2011

Вы можете использовать значения МЕСЯЦ и ДЕНЬ mysql. Может быть что-то вроде:

Model.where("MONTH(created_at) = ? and DAY(created_at) = ?", somedate.month, somedate.day)
10 голосов
/ 18 августа 2011

Общее решение, которое должно работать с большинством баз данных SQL (включая MySQL и PostgreSQL):

Entry.where('extract(month from created_at) = ? AND extract(day from created_at) = ?', d.month, d.day)

SQLite не понимает extract, поэтому вам придется использовать:

Entry.where("strftime('%m/%d', created_at) = ?", d.strftime('%m/%d'))
2 голосов
/ 18 августа 2011

Предположим, что СУБД - это MySQL, и у вас есть форма с выпадающим списком для выбора месяца и / или date_of_months, может быть, вы можете создать named_scope, например:

scope :by_date_or_month, lambda { |date, month| {:conditions => ["DAYOFMONTH(created_at) = ? or MONTH(created_at) = ?", date, month]}}

Тест из IRB:

Model.by_date_or_month(31,8)
Model.by_date_or_month(nil,8)
2 голосов
/ 18 августа 2011

Предполагается, что вы используете mysql:

User.where(["DAY(created_at) = ? AND MONTH(created_at) = ?", date.day, date.month])
...