如何查找上个月创建的记录?

时间:2009-02-02 09:31:24

标签: ruby-on-rails ruby

我有一张表,每天都会添加新记录。我如何查找上个月创建的记录?

11 个答案:

答案 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剧集也应该是有用的:

http://railscasts.com/episodes/108

答案 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)
}