我需要查询一天内的评论。该字段是标准时间戳的一部分,是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'"
我需要查询一天内的评论。该字段是标准时间戳的一部分,是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'"
当前回答
有几种方法。你可以使用这个方法:
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)
其他回答
请注意,目前接受的答案在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)
如果你只想休息一天,这样做会更容易:
Comment.all(:conditions => ["date(created_at) = ?", some_date])
我个人会创建一个范围,使其更具可读性和可重用性:
在你的评论中。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)
希望能有所帮助。
我认为应该有一个默认的活动记录行为。查询日期很困难,特别是涉及到时区时。
总之,我用:
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
}
有几种方法。你可以使用这个方法:
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)