我需要查询一天内的评论。该字段是标准时间戳的一部分,是 created_at
。所选日期来自 date_select
。
我如何使用 ActiveRecord
来做到这一点?
我需要类似的东西:
"SELECT * FROM comments WHERE created_at BETWEEN '2010-02-03 00:00:00' AND '2010-02-03 23:59:59'"
请注意,当前接受的答案在 Rails 3 中已弃用。您应该这样做:
Comment.where(:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day)
或者,如果您想或必须使用 pure string conditions,您可以执行以下操作:
Comment.where('created_at BETWEEN ? AND ?', @selected_date.beginning_of_day, @selected_date.end_of_day)
我会亲自创建一个范围以使其更具可读性和可重用性:
在您的 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 引入了一个新的日期助手方法 all_day
,请参阅:https://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})
有关详细信息,请查看 Time calculations
注意:此代码为 deprecated。如果您使用的是 Rails 3.1/3.2,请使用答案中的代码
date()
函数;它可能更独立于数据库。
我运行此代码以查看检查的答案是否有效,并且不得不尝试交换日期以使其正确。这奏效了——
Day.where(:reference_date => 3.months.ago..Time.now).count
#=> 721
如果您认为输出应该是 36,请考虑一下,先生,3 天对 3 个人有多少天?
Comment.find(:all, :conditions =>["date(created_at) BETWEEN ? AND ? ", '2011-11-01','2011-11-15'])
我一直在使用 3 个点,而不是 2 个。三个点为您提供了一个在开始时打开并在结束时关闭的范围,因此如果您对后续范围进行 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 []>
而且,是的,使用范围总是很好的!
如果你只想得到一天,这样会更容易:
Comment.all(:conditions => ["date(created_at) = ?", some_date])
有几种方法。您可以使用此方法:
start = @selected_date.beginning_of_day
end = @selected_date.end_of_day
@comments = Comment.where("DATE(created_at) BETWEEN ? AND ?", start, end)
或这个:
@comments = Comment.where(:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day)
我认为应该有一个默认的活动记录行为。查询日期很困难,尤其是涉及时区时。
无论如何,我使用:
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
}
您可以使用下面的 gem 来查找日期之间的记录,
这个 gem 很容易使用和更清晰 By star 正在使用这个 gem,API 更清晰,文档也得到了很好的解释。
Post.between_times(Time.zone.now - 3.hours, # all posts in last 3 hours
Time.zone.now)
在这里您也可以通过我们的字段Post.by_month("January", field: :updated_at)
请查看文档并尝试一下。
不定期副业成功案例分享
1..1000000000000
我不清楚“单独使用范围”是什么意思scope :between, -> (a, b) { where(created_at: a..b) }