rails activerecordによって今日作成されたレコードを取得するにはどうすればよいですか?


回答:


220
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)

PS:Harish Shettyの回答が私の回答よりも優れていたため、この回答は変更されました。私の答えとして受け入れられます。コミュニティサポートのためにこの回答を更新しました


4
Post.where(created_at:Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
ラファエルオリベイラ

1
今日の終わりまでに何かが作成されたかどうかを確認しても意味がありません(明日はまだ発生していないため)。
jakeonrails

4
一方で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)。時間を操作できる方法で行うにはポイントがあります。たとえば、テストしている場合、おそらく時間を操作し、最初のオプションは機能しません。デバッグに時間がかかる可能性のある、このような将来起こりうる障害を回避したいとします。
lucasarruda 2016年

121

私はこの質問に受け入れられた答えがあることを知っています。承認された回答で提案されているソリューションは、テーブルサイズが大きくなるとパフォーマンスの問題を引き起こす可能性があります。

通常、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

1
索引付けについての素晴らしい点。scopeこの投稿の例はRails 2の見出しの下にあるように見えるため、Rails 3のみを対象としていることを明確にしたかっただけです。Rails 2では、named_scopeではなくを使用する必要がありますscope。また、Rails 3ではdef self.today where("created_at >= ?", Time.now.beginning_of_day) end 、ラムダを忘れることができるので、この場合はスコープを使用するよりもおそらくクリーンなクラスメソッドを同等に使用 できます。
evanrmurphy 2013年

@evanrmurphy、それを指摘してくれてありがとう。正解です。
Harish Shetty 2013年

@evanrmurphyは、コメントを「Rails 3のみ」から「Rails 3以上」に修正できますか?
kaichanvong 2014

@kaichanvong私はRails 4に詳しくないので、「Rails 3(以上)?」と言いたいのですが、コメントは編集できません:-/
evanrmurphy

30

MySQL:

Model.all :condition => ["DATE(created_at) = ?", Date.today] # rails 2
Model.where("DATE(created_at) = ?", Date.today) # rails 3

PostgreSQL:

Model.all :condition => ["created_at::date = ?", Date.today] # rails 2
Model.where("created_at::date = ?", Date.today) # rails 3

19

Mohit Jainの回答がRails3に適合

Model.where "DATE(created_at) = DATE(?)", Time.now

16

Rails 5.1には、all_dayここで役立つヘルパーがあります。

Post.where(created_at: Date.today.all_day)

または

Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)


5

model.rb

scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }

posts_controller.rb

Post.posted_today

2
@Pathiv、between_period面白いですね。そのためのドキュメントは見つかりませんでした。リンクを提供してもらえますか?レールは比較のためにどのように列を選択するのですか?
Harish Shetty 2014年

1

何らかの理由で、この投稿の他のソリューションもStackOverflowの他のソリューションも機能しませんでした(Rails 4.2.4およびRuby 2.2.3p173を使用)。これは、私のPostgresデータベースで使用できる唯一のクエリです。

Post.where("created_at >= TIMESTAMP 'now'")

-1

今日から作成されたレコードを照会するには

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が将来あったアイテムのみを検索します。
PRホワイトヘッド

うん、私は、その答えから素敵なキャッチのおかげで、それを削除します
ヒエウファム

現在の問題は、将来の日付でマークされたレコードだけでなく、今日のレコードも表示されることです。間を使わないようにする場合は.lteq(Time.zone.now.end_of_day))、同様に指定する必要があります。
PRホワイトヘッド

-4

今日作成されたレコードを取得するためのレール4.2.3では、mysqlを使用して以下を使用します。

@usergoals = Goal.where( "userid =:userid and Date(created_at)=:date"、{userid:params [:id]、date:Date.today})

ここでは、必要に応じて複数の条件を使用して、単一の条件で編集できるようにしています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.