#ruby-on-rails-3 #date
#ruby-on-rails-3 #Дата
Вопрос:
Как я могу найти запись по дате, но без года?
это то, что у меня есть :
@date = Date.today
@article = Article.find_by_date(@date)
Но на самом деле то, что я хочу сделать, это выполнить поиск статьи только по месяцу и дню. Год не важен.
Ответ №1:
Протестировано с помощью SQLite:
Model.find(:all, :conditions => ["STRFTIME('%m-%d', field_name) = '?-?'", 12, 25])
Сгенерированный запрос иллюстрирует, как это находит все, где field_name
находится Рождество:
Model Load (16.1ms) SELECT "models".* FROM "models" WHERE (STRFTIME('%m-%d', field_name) = '12-25')
Я также добился успеха с более коротким «field_name LIKE ‘%-MM-DD'», но это был MySQL; согласно его руководству, он действительно использует строки для чтения и записи дат. YMMV.
Ответ №2:
Я подозреваю, что это зависит от того, какую базу данных вы используете. Разные реализации имеют разные имена / синтаксис для функции EXTRACT или DATE_PART. На PostgreSQL это работает:
Model.where('EXTRACT(month FROM field_name) = ? AND EXTRACT(day FROM field_name) = ?', 12, 25)
Ответ №3:
Вы можете сделать:
Model.all.where(["DAY(`date`) = ? AND MONTH(`date`) = ?", Date.current., 12])
Просто!
Ответ №4:
Подход, не зависящий от базы данных, заключался бы в добавлении атрибутов к вашей модели для date_month и date_day (и установке их с помощью обратного вызова before_save). Что-то вроде:
before_save :set_date_day_and_month
def set_date_day_and_month
self.date_month = date.month
self.date_day = date.day
end
#untested
Затем вы можете выполнять прямые запросы, которые не будут включать функции, специфичные для db. Нравится:
Article.where('date_month = ? AND date_day = ?', 12, 25)
#for articles on Christmas
Или:
Article.where('date_month = ? AND date_day = ?', Date.today.month, Date.today.day)
#for articles on this date any year