回答:
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
PS:Harish Shettyの回答が私の回答よりも優れていたため、この回答は変更されました。私の答えとして受け入れられます。コミュニティサポートのためにこの回答を更新しました
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
非常に賢いですが、私は保証しますPost.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
。時間を操作できる方法で行うにはポイントがあります。たとえば、テストしている場合、おそらく時間を操作し、最初のオプションは機能しません。デバッグに時間がかかる可能性のある、このような将来起こりうる障害を回避したいとします。
私はこの質問に受け入れられた答えがあることを知っています。承認された回答で提案されているソリューションは、テーブルサイズが大きくなるとパフォーマンスの問題を引き起こす可能性があります。
通常、created_at
列に基づいてルックアップを実行する場合は、移行ファイルのテーブルにインデックスを追加します。
add_index :posts, :created_at
さて、今日作成されたレコードを検索するには:
Rails 3/4
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
特定の日に作成された投稿を検索する。
Post.where(:created_at => (date.beginning_of_day..date.end_of_day))
--------- または -------------
モデルに静的メソッドを追加する
class Post < ActiveRecord::Base
def self.today
where("created_at >= ?", Time.zone.now.beginning_of_day)
end
end
Post.today #returns posts today
Rails 2
Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])
--------- または -------------
named_scopeをモデルに追加します
class Post < ActiveRecord::Base
named_scope :today, lambda {
{
:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day]
}
}
end
Post.today #returns posts today
scope
この投稿の例はRails 2の見出しの下にあるように見えるため、Rails 3のみを対象としていることを明確にしたかっただけです。Rails 2では、named_scope
ではなくを使用する必要がありますscope
。また、Rails 3ではdef self.today where("created_at >= ?", Time.now.beginning_of_day) end
、ラムダを忘れることができるので、この場合はスコープを使用するよりもおそらくクリーンなクラスメソッドを同等に使用 できます。
Mohit Jainの回答がRails3に適合
Model.where "DATE(created_at) = DATE(?)", Time.now
Rails 5.1には、all_day
ここで役立つヘルパーがあります。
Post.where(created_at: Date.today.all_day)
または
Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
これは、で属性を「スコープ」しますtable_name
。
model.rb
scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }
posts_controller.rb
Post.posted_today
between_period
面白いですね。そのためのドキュメントは見つかりませんでした。リンクを提供してもらえますか?レールは比較のためにどのように列を選択するのですか?
今日から作成されたレコードを照会するには
arelでスコープを使用する
class Post < ActiveRecord::Base
scope :create_from_today, -> {
where(arel_table[:created_at].gteq(Time.zone.now.beginning_of_day))
}
end
その後、それを使用できます
today_posts = Post.created_from_today
where('created_at >= now()')
created_atが将来あったアイテムのみを検索します。
.lteq(Time.zone.now.end_of_day))
、同様に指定する必要があります。