我有一张表,每天都会添加新记录。我如何查找上个月创建的记录?
答案 0 :(得分:11)
设置命名范围:
named_scope :in_last_month, :conditions => [ "records.created_at > ?", 1.month.ago ]
要调用它(在你的控制器中):
Record.in_last_month
答案 1 :(得分:10)
我认为named_scope
是一种相当优雅的方式,但是如果你走这条路线,你会想要用lambda
方法来使用它,这样时间就不会限制在最初加载应用程序时。
例如,这个:
named_scope :last_month, :conditions =>
['created_at > ? AND created_at < ?',
Date.today.last_month.beginning_of_month, Date.today.beginning_of_month]
将在您的应用程序启动的第一个月正常运行,但在下个月不正常,除非应用程序重新启动。
但是这个:
named_scope :last_month, lambda {
{:conditions => ['created_at > ? AND created_at < ?',
Date.today.last_month.beginning_of_month, Date.today.beginning_of_month]}}
每次都会工作,因为lambda方法会在每次调用时执行,重新评估Date.today
。
答案 2 :(得分:3)
假设您的记录带有时间戳,您可以执行以下操作:
Thing.find(:all, :conditions => ["created_at > ?", Time.now - 1.month])
如果它们没有带时间戳,您应该开始存储信息,因为这是您以后要查找的内容。
答案 3 :(得分:2)
接受的答案和lambda改进在Rails 4中不起作用。
Rails 4的更新:
scope :last_month, -> {
where( 'created_at > ? AND created_at < ?',
Date.today.last_month.beginning_of_month,
Date.today.beginning_of_month )}
答案 4 :(得分:1)
谢谢大家,我最终选择了这个:
find(:all, :conditions => ['created_at > ? AND created_at < ?', Date.today.last_month.beginning_of_month, Date.today.beginning_of_month])
答案 5 :(得分:1)
在我的一个项目中,我用这种方式:
Thing.where('created_at BETWEEN ? AND ? ', DateTime.now.beginning_of_month - 1.month, DateTime.now.beginning_of_month)
使用last_month在Rails 3中的会抛出错误:Date.today.last_month.beginning_of_month
NoMethodError:未定义的方法`last_month'
答案 6 :(得分:0)
你的桌子上有“常用”字段吗?请参阅RoR wiki以获取它们的列表。这样,您可以表达特殊查询以找到答案。
答案 7 :(得分:0)
Thing.find(:all, :conditions => ["created_at > ?", 1.month.ago.at_beginning_of_month])
答案 8 :(得分:0)
我还没有足够的声誉进行投票,但请注意提及在named_scopes中使用lambdas的评论。关于这个主题的Railscasts剧集也应该是有用的:
答案 9 :(得分:0)
这是SQL BETWEEN 语法
的理想选择named_scope :last_month, :conditions => ['created_at BETWEEN ? AND ?', Date.today.last_month.beginning_of_month, Date.today.beginning_of_month])
答案 10 :(得分:0)
在Rails 4+上尝试此操作,请注意Date.current
将使用您应用程序的时区(在application.rb中指定):
scope :created_last_month, lambda {
where(created_at: Date.current.last_month.beginning_of_month..Date.current.last_month.end_of_month)
}