假设我有一个Order
模型:
class Order < ActiveRecord::Base
scope :last_month, ->(object) { where(“publish_date > ?”, 1.month.ago) }
end
显然,这就是如何在Rails中定义作用域。但是括号里的对象是什么呢?如果object
表示最终的AR集合…为什么说得通呢?幕后发生了什么?为什么这里需要一个过程?
If对象表示结果AR集合
不,object
代表作用域的一个参数。如果您有这个作用域,例如:
class User
scope :created_after, ->(timestamp) { where('created_at > ?', timestamp) }
end
那么你可以这样调用它:
User.created_after(3.days.ago)
但是括号里面的对象是什么呢?
这一行是语法糖:
lambda { |object| where("publish_date > ?", 1.month.ago) }
object
值是lambda的参数。
If object表示最终的AR集合…为什么说得通呢?
正如Sergio所说,它代表了您可以传递的其他参数。
幕后发生了什么?为什么这里需要一个过程?
这个过程更像是对老问题的强制解决方案。所以当你定义像这样的作用域时:
scope :created_after, Time.now
时间。Now将在rails应用程序启动时立即运行。所以它不会重新评估时间。每次你运行瞄准镜。Lambda确保每次都执行逻辑。