如何获取Rails activerecord创建的今天的记录?


Answers:


220
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)

PS:此答案已被修改,因为Harish Shetty的答案比我的要好。作为我的答案被接受。我已更新此答案以获得社区支持


4
一个人可能会在Post.where(created_at:Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)做
Rafael Oliveira

1
没有必要检查是否在今天结束之前创建了某些东西(因为明天还没有发生)。
jakeonrails

4
虽然Post.where("created_at >= ?", Time.zone.now.beginning_of_day)很聪明,但我还是会赞同Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)。有一种可以操纵时间的方式可以做。例如,如果您正在测试,则可能会操纵时间,然后第一个选项将不起作用。您想避免将来可能发生的调试故障,而这种故障可能会花费一些时间。
lucasarruda

121

我知道这个问题的答案可以接受。当表大小增加时,可接受的答案中建议的解决方案可能会导致性能问题。

通常,如果您基于created_at列执行查找,请在迁移文件中的表上添加索引。

add_index :posts, :created_at

现在,要查找今天创建的记录:

导轨3/4

Post.where("created_at >= ?", Time.zone.now.beginning_of_day)

查找特定日期创建的帖子。

Post.where(:created_at => (date.beginning_of_day..date.end_of_day))

--------- -------------

向模型添加静态方法

class Post < ActiveRecord::Base
  def self.today
    where("created_at >= ?", Time.zone.now.beginning_of_day)
  end
end

Post.today #returns posts today

滑轨2

Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])

--------- -------------

向模型添加named_scope

class Post < ActiveRecord::Base    
  named_scope :today, lambda { 
    {
      :conditions => ["created_at >= ?", Time.zone.now.beginning_of_day]
    }
  }
end

Post.today #returns posts today

1
关于索引的要点。只是想澄清一下本文中的scope示例仅适用于Rails 3,因为它看起来像在Rails 2标题下。在Rails 2中,您需要使用named_scope而不是scope。同样,在Rails 3中,您可以等效地使用类方法def self.today where("created_at >= ?", Time.now.beginning_of_day) end ,在这种情况下,该方法 可能比使用范围更干净,因为它允许您放弃lambda。
evanrmurphy

@evanrmurphy,感谢您的注意。我有固定的答案。
Harish Shetty

@evanrmurphy可以/应该将您的评论从“仅限Rails 3”修改为“ Rails 3及更高版本”吗?
kaichanvong 2014年

@kaichanvong我对Rails 4不熟悉,所以我想说“ Rails 3(及更高版本?)”,但这样我就不能让我编辑评论了:-/
evanrmurphy 2014年

30

MySQL:

Model.all :condition => ["DATE(created_at) = ?", Date.today] # rails 2
Model.where("DATE(created_at) = ?", Date.today) # rails 3

PostgreSQL:

Model.all :condition => ["created_at::date = ?", Date.today] # rails 2
Model.where("created_at::date = ?", Date.today) # rails 3

19

Mohit Jain的答案适用于Rails3

Model.where "DATE(created_at) = DATE(?)", Time.now

16

Rails 5.1有一个all_day在这里有用的助手。

Post.where(created_at: Date.today.all_day)

要么

Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)


5

模型

scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }

posts_controller.rb

Post.posted_today

2
@Pathiv,between_period看起来很有趣。我没有找到任何文档。您可以提供一些链接吗?Rails如何选择要比较的列?
Harish Shetty

1

出于某种原因,本文中的其他解决方案以及StackOverflow上的其他解决方案都不适合我(使用Rails 4.2.4和Ruby 2.2.3p173)。这是我可以使用Postgres数据库的唯一查询:

Post.where("created_at >= TIMESTAMP 'now'")

-1

查询从今天开始创建的记录

使用范围与arel

class Post < ActiveRecord::Base    
  scope :create_from_today, -> {
    where(arel_table[:created_at].gteq(Time.zone.now.beginning_of_day))
  }
end

然后我们可以使用它

today_posts = Post.created_from_today

where('created_at >= now()')只会找到将来created_at所在的项目。
PR Whitehead,

是的,我将其从答案中删除,谢谢!
Hieu Pham19年

您现在遇到的问题是,会标出带有将来日期的记录以及今天的记录。如果您尝试避免在两者之间使用,则也应指定.lteq(Time.zone.now.end_of_day))
怀特海德公关

-4

在Rails 4.2.3中,为了获取今天创建的记录,使用mysql使用以下命令。

@usergoals = Goal.where(“ userid =:userid and Date(created_at)=:date”,{userid:params [:id],date:Date.today})

在这里,如果您希望对单个条件进行编辑,则我使用了多个条件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.