如何通过rails activerecord获取今天创建的记录?

Vic*_*Lam 105 ruby-on-rails date rails-activerecord

当我想要获取今天创建的所有记录时,我应该如何编写条件语句?

Moh*_*ain 207

Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
Run Code Online (Sandbox Code Playgroud)

PS:这个答案已被修改为Harish Shetty的答案比我的好.我的答案被接受了.我已更新此答案以获得社区支持

  • 有人可能会做Post.where(created_at:Time.zone.now.beginning_of_day..Time.zone.now.end_of_day) (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)`.在某种程度上你可以操纵时间.例如,如果您正在测试,您可能会操纵时间,然后第一个选项将无效.您希望避免可能需要一些调试时间的未来可能的故障. (4认同)
  • 在最新版本中,这可以通过“Post.where(created_at: Time.current.all_day)”更加简化 (4认同)

Har*_*tty 119

我知道这个问题有一个公认的答案.在表格大小增加时,在接受的答案中建议的解决方案可能会导致性能问题.

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

add_index :posts, :created_at
Run Code Online (Sandbox Code Playgroud)

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

Rails 3/4

Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
Run Code Online (Sandbox Code Playgroud)

查找在特定日期创建的帖子.

Post.where(:created_at => (date.beginning_of_day..date.end_of_day))
Run Code Online (Sandbox Code Playgroud)

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

向模型添加静态方法

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

Post.today #returns posts today
Run Code Online (Sandbox Code Playgroud)

Rails 2

Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])
Run Code Online (Sandbox Code Playgroud)

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

将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
Run Code Online (Sandbox Code Playgroud)


jig*_*fox 29

MySQL的:

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

PostgreSQL的:

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


the*_*fme 18

Mohit Jain的答案适用于Rails3

Model.where "DATE(created_at) = DATE(?)", Time.now
Run Code Online (Sandbox Code Playgroud)


Ste*_*ntz 9

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

Post.where(created_at: Date.today.all_day)
Run Code Online (Sandbox Code Playgroud)

要么

Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)
Run Code Online (Sandbox Code Playgroud)


Raf*_*ira 7

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

这个"名称范围"的属性与table_name.


Par*_*hiv 5

model.rb

scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }
Run Code Online (Sandbox Code Playgroud)

posts_controller.rb

Post.posted_today
Run Code Online (Sandbox Code Playgroud)

  • @Pathiv,`between_period` 看起来很有趣。我没有找到任何文档。你能提供一些链接吗?rails如何选择列进行比较? (3认同)