【发布时间】:2010-05-27 08:59:21
【问题描述】:
当我想要获取今天创建的所有记录时,我应该如何编写条件语句?
【问题讨论】:
标签: ruby-on-rails date rails-activerecord
当我想要获取今天创建的所有记录时,我应该如何编写条件语句?
【问题讨论】:
标签: ruby-on-rails date rails-activerecord
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
PS:这个答案已被修改,因为 Harish Shetty 的答案比我的好。因为我的回答被接受了。我已更新此答案以获得社区支持
【讨论】:
Post.where(created_at: Time.current.all_day) 可以更加精简
Mohit Jain 的答案适用于 Rails3
Model.where "DATE(created_at) = DATE(?)", Time.now
【讨论】:
Rails 5.1 有一个 all_day 帮助器,在这里很有用。
Post.where(created_at: Date.today.all_day)
或
Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)
【讨论】:
我知道这个问题有一个公认的答案。当表大小增加时,接受的答案中建议的解决方案可能会导致性能问题。
通常,如果您基于 created_at 列执行查找,请在迁移文件中的表上添加索引。
add_index :posts, :created_at
现在,查找今天创建的记录:
Rails 3/4
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
查找在特定日期创建的帖子。
Post.where(:created_at => (date.beginning_of_day..date.end_of_day))
--------- OR -------------
为模型添加静态方法
class Post < ActiveRecord::Base
def self.today
where("created_at >= ?", Time.zone.now.beginning_of_day)
end
end
Post.today #returns posts today
Rails 2
Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])
--------- OR -------------
为你的模型添加一个 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
【讨论】:
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。
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
【讨论】:
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
这用table_name“命名范围”属性。
【讨论】:
由于某种原因,这篇文章中的其他解决方案和 StackOverflow 上的其他解决方案都对我不起作用(使用 Rails 4.2.4 和 Ruby 2.2.3p173)。这是我可以使用我的 Postgres 数据库的唯一查询:
Post.where("created_at >= TIMESTAMP 'now'")
【讨论】:
模型.rb
scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }
posts_controller.rb
Post.posted_today
【讨论】:
between_period 看起来很有趣。我没有找到任何文档。你能提供一些链接吗? rails 如何选择列进行比较?
查询今天创建的记录
将范围与 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 在未来的项目。
.lteq(Time.zone.now.end_of_day))。
在 rails 4.2.3 获取今天创建的记录,使用 mysql 使用以下。
@usergoals = Goal.where("userid = :userid and Date(created_at) = :date", { userid: params[:id], date: Date.today })
如果你愿意,我在这里使用多个条件,你可以为单个条件编辑它。
【讨论】: