如何在Rails 3.1中查找本月创建的记录?

14

有人知道在Rails 3.1中查找本月创建记录的最佳查询吗?


你应该添加更多细节,比如模型定义。 - lucapette
4个回答

40
class Model
  scope :this_month, -> { where(created_at: Time.now.beginning_of_month..Time.now.end_of_month) }
end

你可以这样调用它:

Model.this_month

这在SQLite中能工作吗?我试图在SQLite中运行此代码,但出现了以下错误:ActiveRecord :: StatementInvalid:SQLite3 :: SQLException:附近的“<”:语法错误:SELECT“orders”。* FROM“orders” WHERE(created_at> '2011-11-01 04:00:00.000000'AND <'2011-12-01 04:59:59.999999') 来自 / Users / mrchess / .rvm / gems / ruby-1.9.2-p290 / gems / sqlite3-1.3.4 / lib / sqlite3 / database.rb:91:initialize - kidcapital
2
嗯,尝试使用 BETWEEN"created_at BETWEEN ? AND ?" - Alex Peattie
这个答案中的代码是可行的,但我希望提供一个无需作用域的答案,或者在提供作用域答案的同时也提供无作用域的答案,因为实际上并不需要作用域就可以实现 OP 所要求的功能,新手可能会被误导认为需要使用作用域。 - Jason Swett

24

我更喜欢不用SQL:

Model.where(:created_at => Time.now.beginning_of_month..Time.now.end_of_month)

或者作为一个范围:

class Model < ActiveRecord::Base
  scope :this_month, -> { where(:created_at => Time.now.beginning_of_month..Time.now.end_of_month) }
end

3
提供的范围示例答案是错误的。Rails在作用域上使用急切评估,因此Time.now.beginning_of_month将始终是最初评估作用域时该月份的开始。在作用域中使用日期的正确方法是将lambda传递给scope
class Model < ActiveRecord::Base
  scope :this_month, -> { where(created_at: Time.now.beginning_of_month..Time.now.end_of_month) }
end

在Rails 4中,作用域必须使用可调用对象,例如LambdaProc

3
取决于您是要查看所有模型的所有记录还是特定模型等...
对于单个模型,您可以执行以下操作:
User.where('created_at >= ? and created_at <= ?', Time.now.beginning_of_month, Time.now.end_of_month)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接