Rails: сделать этот запрос независимым от базы данных?

У меня есть эти две строки в моей модели, написанной для PostgreSQL:

named_scope :by_month, lambda { |month| { :conditions => ["EXTRACT(MONTH FROM recorded_on) = ?", month] }}
named_scope :by_year, lambda { |year| { :conditions => ["EXTRACT(YEAR FROM recorded_on) = ?", year] }}

Я запускаю PostgreSQL в производстве, но я разрабатываю SQLite3. Как я могу написать эти строки таким образом, чтобы они не зависели от базы данных?

Кстати, «recorded_on» формируется из следующего:

Model.recorded_on = Time.parse("Fri, 01 May 2009 08:42:23 -0400")

person neezer    schedule 21.05.2009    source источник


Ответы (2)


Хорошо, узнал, что есть лучший способ (спасибо этой статьи):

Принципиально ничего не делать в модели!

date = Date.new(year, month, 1)
Model.find(:all, :conditions => { :recorded_on => date..date.end_of_month })
person neezer    schedule 21.05.2009

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

  named_scope :by_month, lambda { |month| 
    d1 = Date.new(2009, month, 1)
    d2 = d1.end_of_month
    { :conditions => ['recorded_on between ? and ?', d1, d2]}
  }

  named_scope :by_year, lambda { |year| 
    d1 = Date.new(year, 1, 1)
    d2 = d1.end_of_year
    { :conditions => ['recorded_on between ? and ?', d1, d2]}
  }

Если у вас есть время, вам нужно быть немного умнее с часами, минутами и секундами.

person Mike Woodhouse    schedule 21.05.2009
comment
Пробовал это в сценарии/консоли, и я получаю эту ошибку: ActiveRecord::StatementInvalid: PGError: ERROR: столбец report_run_date не существует ?? - person neezer; 21.05.2009
comment
Упс - оставил свое собственное имя столбца в коде от тестирования. Фиксированный. Хотя на моем столе это работало прекрасно... ;-) - person Mike Woodhouse; 22.05.2009