8

タイムスタンプを省略して、特定の日付に等しい日付をモデルで検索しようとしています。Railsでは、これを次のように簡単に実行DateTime.to_date == somedateできますが、created_atのような列全体にto_dateメソッドを適用できないSQLでの定式化はそれほど簡単ではないと思います。

Foo.where("created_at == some_day_without_time_stamp").count

当初、postgresqlデータベースを使用していたので、psql構文を使用できると思っていましたが、ActiveRecordに任せて、どのSQLが最も適切かを判断し、データベースベンダーに依存しないようにします。これは、追加のプラグインやgemなしで可能ですか?

4

4 に答える 4

11

私は次のようなことをします...

someday = Date.today
Foo.where( :created_at => (someday)..(someday + 1.day) )

created_atこれにより、午前0時からまでのすべての日付がキャプチャさsomedaysomeday + 1ます。これは包括的です(したがって、+ 1日の深夜にFooが作成した強打が含まれます)が、タイムスタンプをいじることなく、ニーズに「十分に適している」可能性があります。

良さのために、私はそれを次のようにまとめますscope

scope :on_day, ( lambda do |someday|
  where( :created_at => (someday)..(someday + 1.day) )
end )

それで

Foo.on_day( Date.yesterday ).count

読みやすいです。

于 2012-12-04T10:26:59.553 に答える
9

DateTimeクラスには、これを行うための2つの便利なメソッドがbeginning_of_dayありend_of_dayます。

この場合、Dateオブジェクトがある場合は、次のようにします。

Foo.where('created_at >= #{Date.today.to_time.beginning_of_day} AND 
           created_at <= #{Date.today.to_time.end_of_day}')

DateオブジェクトをDateTimeオブジェクトに変換する必要があることに注意してください

于 2014-04-02T07:42:17.297 に答える
7

スコープ付き:

scope :on_day, (lambda do |day|
   where(date: day.beginning_of_day..day.end_of_day)
end)

使用:

Foo.on_day(Date.today).count
于 2014-11-10T05:05:53.047 に答える
3

試すcreated_at >= some_day_with_00:00:00 timestamp and create_at < some_day_plus_one_with_00:00:00 timestamp

于 2012-12-03T18:52:52.353 に答える