1

私のモデルには、PostgreSQL 用に書かれた次の 2 行があります。

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")
4

2 に答える 2

4

さて、もっと良い方法があることがわかりました(この記事のおかげです):

モデルでは基本的に何もしません!

date = Date.new(year, month, 1)
Model.find(:all, :conditions => { :recorded_on => date..date.end_of_month })
于 2009-05-21T19:46:43.023 に答える
0

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]}
  }

時間がある場合は、時間、分、秒をもう少し賢くする必要があります。

于 2009-05-21T16:30:42.777 に答える