Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails ActiveRecord日期介于_Ruby On Rails_Rails Activerecord_Ruby On Rails 2 - Fatal编程技术网

Ruby on rails Rails 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

我需要查询一天内的评论。该字段是标准时间戳的一部分,创建于。所选日期来自所选日期

我如何使用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_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