回答:
現在受け入れられている回答はRails 3で廃止されることに注意してください。代わりにこれを行う必要があります。
Comment.where(:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day)
または、純粋な文字列条件を使用する必要がある場合は、次のようにできます。
Comment.where('created_at BETWEEN ? AND ?', @selected_date.beginning_of_day, @selected_date.end_of_day)
1..1000000000000
されます。「範囲を単独で使用する」という意味がわかりません
scope :between, -> (a, b) { where(created_at: a..b) }
私はそれをより読みやすく再利用できるようにするために個人的にスコープを作成しました:
Comment.rbでは、スコープを定義できます。
scope :created_between, lambda {|start_date, end_date| where("created_at >= ? AND created_at <= ?", start_date, end_date )}
次に、次の間に作成されたクエリを実行します。
@comment.created_between(1.year.ago, Time.now)
それが役に立てば幸い。
#between?
、範囲を受け入れたと仮定しました。
Rails 5.1では、新しい日付ヘルパーメソッドが導入されました。httpsall_day
://github.com/rails/rails/pull/24930を参照してください。
>> Date.today.all_day
=> Wed, 26 Jul 2017 00:00:00 UTC +00:00..Wed, 26 Jul 2017 23:59:59 UTC +00:00
Rails 5.1を使用している場合、クエリは次のようになります。
Comment.where(created_at: @selected_date.all_day)
require 'active_record'
で準備は完了です。
このコードはあなたのために働くはずです:
Comment.find(:all, :conditions => {:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day})
詳細については、時間の計算をご覧ください
注:このコードは非推奨です。Rails 3.1 / 3.2を使用している場合は、回答のコードを使用してください
date()
関数に依存しないため、受け入れられた回答よりも気に入っています。潜在的には、よりdbに依存しません。
私はこのコードを実行して、チェックされた答えが機能するかどうかを確認しました。日付を入れ替えて、正しい結果を得なければなりませんでした。これはうまくいった
Day.where(:reference_date => 3.months.ago..Time.now).count
#=> 721
出力が36である必要があると考えている場合は、これを考慮してください、サー、3日は3人で何日ですか?
私は2ではなく3つのドットを使用しています。3つのドットは、最初は開いていて、最後は閉じている範囲を提供します。そのため、後続の範囲に対して2つのクエリを実行すると、同じ行を戻すことができません両方とも。
2.2.2 :003 > Comment.where(updated_at: 2.days.ago.beginning_of_day..1.day.ago.beginning_of_day)
Comment Load (0.3ms) SELECT "comments".* FROM "comments" WHERE ("comments"."updated_at" BETWEEN '2015-07-12 00:00:00.000000' AND '2015-07-13 00:00:00.000000')
=> #<ActiveRecord::Relation []>
2.2.2 :004 > Comment.where(updated_at: 2.days.ago.beginning_of_day...1.day.ago.beginning_of_day)
Comment Load (0.3ms) SELECT "comments".* FROM "comments" WHERE ("comments"."updated_at" >= '2015-07-12 00:00:00.000000' AND "comments"."updated_at" < '2015-07-13 00:00:00.000000')
=> #<ActiveRecord::Relation []>
そして、はい、常にスコープを使用すると便利です!
これにはデフォルトのアクティブレコード動作があるはずです。特にタイムゾーンが関係している場合、日付のクエリは困難です。
とにかく、私は使用します:
scope :between, ->(start_date=nil, end_date=nil) {
if start_date && end_date
where("#{self.table_name}.created_at BETWEEN :start AND :end", start: start_date.beginning_of_day, end: end_date.end_of_day)
elsif start_date
where("#{self.table_name}.created_at >= ?", start_date.beginning_of_day)
elsif end_date
where("#{self.table_name}.created_at <= ?", end_date.end_of_day)
else
all
end
}