Answers:
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
PS:此答案已被修改,因为Harish Shetty的答案比我的要好。作为我的答案被接受。我已更新此答案以获得社区支持
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)
。有一种可以操纵时间的方式可以做。例如,如果您正在测试,则可能会操纵时间,然后第一个选项将不起作用。您想避免将来可能发生的调试故障,而这种故障可能会花费一些时间。
我知道这个问题的答案可以接受。当表大小增加时,可接受的答案中建议的解决方案可能会导致性能问题。
通常,如果您基于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
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。
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
这会用来“命名”属性table_name
。
模型
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))
。