Дата Rails без года

#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