我希望了解 lambda 对该命名范围的影响:
我在我的模型上定义了两个范围:
scope :credits, lambda { where("comparison_ind != 'PEER'")}
vs
scope :credits, where("comparison_ind != 'PEER'")
这两种说法有什么区别? comparison_ind 是属于同一模型的列。
最佳答案
在 Rails 4 中
始终使用 lambda。第二种语法在 Rails 4 中不正确,会抛出错误(ActiveRecord::Relation 的未定义方法 'call')
# activerecord/lib/active_record/scoping/named.rb
scope = all.scoping { body.call(*args) }
在 Rails 3 中
scope
方法在这两种情况下的行为方式相同 - 它创建了一个名为 credits
的新类方法。不同之处在于,当给定一个 lambda 时,它会在每次调用这个新方法以获取范围时评估这个 lambda,而当给定关系时,它只使用已经传递的内容。
# activerecord/lib/active_record/named_scope.rb
options = scope_options.respond_to?(:call) ? scope_options.call(*args) : scope_options
在这种情况下,lambda 总是返回完全相同的关系,因此不会注意到任何差异。
Lambda 表示法通常用于将参数传递给作用域:
scope :before, lambda {|date| where.created_at < date}
然后可以这样使用:
Model.before(1.day.ago)
如果没有 lambda,这自然是不可能写的。
关于ruby-on-rails - 何时以及何时不对命名范围使用 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26528122/