web-dev-qa-db-ja.com

railsの日付の比較

標準のPost.first.created_at datetimeがあるとします。次のようなことをして、2009-06-03 16:57:45.608000 -04:00形式の日時と直接比較できますか?

Post.first.created_at > Time.parse("2009-06-03 16:57:45.608000 -04:00")

編集:両方のフィールドはdatetimesdatesではないです。

31
Tom Lehman

はい、比較演算子を使用して日付を比較できます。例:

irb(main):018:0> yesterday = Date.new(2009,6,13)
=> #<Date: 4909991/2,0,2299161>
irb(main):019:0> Date.today > yesterday
=> true

しかし、日付と日付時刻を比較しようとしていますか?

その場合は、日時を日付に変換してから比較を行います。

これがお役に立てば幸いです。

44
bernie

はい、created_at ActiveRecordの日付/時刻フィールドの値を通常のDateTimeオブジェクト(所有する文字列の解析を取得できるオブジェクトなど)と直接比較できます。

プロジェクトでは、created_at datetimeオブジェクトを持つValueオブジェクトがあります:

iMac:trunk luca$ script/console
Loading development environment (Rails 2.3.2)
>> Value.first.created_at
=> Fri, 12 Jun 2009 08:00:45 CEST 02:00
>> Time.parse("2009-06-03 16:57:45.608000 -04:00")
=> Wed Jun 03 22:57:45 0200 2009
>> Value.first.created_at > Time.parse("2009-06-03 16:57:45.608000 -04:00")
=> true

Created_atフィールドは次のように定義されます:

  create_table "values", :force => true do |t|
    [...]
    t.datetime "created_at"
  end

N.B.フィールドが日付ではなく日付である場合は、時間に変換する必要があります。

Post.first.created_at.to_time > Time.parse("2009-06-03 16:57:45.608000 -04:00")

または日付を解析します:

Post.first.created_at > Date.parse("2009-06-03 16:57:45.608000 -04:00")

それ以外の場合は、次を取得します。

ArgumentError: comparison of Date with Time failed
10
LucaM