Ruby on rails Rails ActiveRecord日期介于
我需要查询一天内的评论。该字段是标准时间戳的一部分,创建于。所选日期来自所选日期 我如何使用ActiveRecord来实现这一点 我需要像这样的东西:Ruby on rails Rails ActiveRecord日期介于,ruby-on-rails,rails-activerecord,ruby-on-rails-2,Ruby On Rails,Rails Activerecord,Ruby On Rails 2,我需要查询一天内的评论。该字段是标准时间戳的一部分,创建于。所选日期来自所选日期 我如何使用ActiveRecord来实现这一点 我需要像这样的东西: "SELECT * FROM comments WHERE created_at BETWEEN '2010-02-03 00:00:00' AND '2010-02-03 23:59:59'" 此代码应适用于您: Comment.find(:all, :conditions => {:created_at => @selected
"SELECT * FROM comments WHERE created_at BETWEEN '2010-02-03 00:00:00' AND '2010-02-03 23:59:59'"
此代码应适用于您:
Comment.find(:all, :conditions => {:created_at => @selected_date.beginning_of_day..@selected_date.end_of_day})
有关更多信息,请查看
注:此代码为。如果您使用的是Rails 3.1/3.2,请使用答案中的代码。如果您只想获得一天的时间,这样做会更容易:
Comment.all(:conditions => ["date(created_at) = ?", some_date])
我个人会创建一个范围,使其更具可读性和可重用性: 在Comment.rb中,您可以定义一个范围:
scope :created_between, lambda {|start_date, end_date| where("created_at >= ? AND created_at <= ?", start_date, end_date )}
希望能有所帮助。请注意,目前公认的答案在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)
我运行了这段代码以查看检查过的答案是否有效,并且必须尝试交换日期以获得正确答案。这起作用了-
Day.where(:reference_date => 3.months.ago..Time.now).count
#=> 721
如果你认为产量应该是36,那么考虑一下,先生,3天到3天多少天? < P>有几种方法。您可以使用以下方法:
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)
您可以使用下面的gem查找日期之间的记录 这个gem非常容易使用,而且更加清晰,我使用这个gem和API的过程更加清晰,文档也得到了很好的解释
Post.between_times(Time.zone.now - 3.hours, # all posts in last 3 hours
Time.zone.now)
在这里,您还可以通过我们的字段Post.by_monthJanuary,field::updated_
请参阅文档并试用。我一直在使用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
}
Rails 5.1全天引入了一种新的日期助手方法,请参见: 如果您使用的是Rails 5.1,则查询如下所示: Comment.where创建地址:@selected\u date.all\u day
好的,但是从形式上我得到了:{writed_at4i=>18,writed_at5i=>56,content=>rrrrrrr,writed_at1i=>2010,writed_at2i=>5,writed_at3i=>4}我如何构建一个对象来使用一天的开始?这就是我需要的:我喜欢这个方法而不是接受的答案,因为它不依赖于db级别的日期函数;它可能更独立于数据库.Day.where:reference_date=>6.months.ago..Time.now有效,谢谢这不是可以创建一个巨大的范围对象吗?@KasperGrubbe如果你单独使用范围,它会,但Rails只使用第一个和最后一个values@KasperGrubbe@Dex不是Rails做的。Ruby中的Range类只保存下限和上限。这在irb中运行良好:1..10000000000我不清楚您所说的“单独使用范围”+1的意思,我们也可以将其设置为范围:范围:介于,->a,b{在何处创建_at:a..b}非常干净的方法…完美!!回到这个答案上来,因为我一直在寻找这个问题。语法猜错了,假设介于?接受了一个范围。这实际上是ActiveSupport gem的一部分,随后是整个ActiveRecord生态系统的一部分,因此它也在Rails之外工作!只需要“活动记录”就可以了!
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
}
>> Date.today.all_day
=> Wed, 26 Jul 2017 00:00:00 UTC +00:00..Wed, 26 Jul 2017 23:59:59 UTC +00:00