我想知道如何在Rails 4中完成以下操作,或者我是否只使用Rails 3方法来使用lambda,它可以以与4相同的方式传递参数。
我对Rails 3很新,并尝试使用运行Rails 4的一些示例。
这是我的Rails 3代码:
class Person < ActiveRecord::Base
scope :find_lazy, lambda {|id| where(:id => id)}
end
# In console I can call
Person.find_lazy(1)
所以,如果这是Rails 4方式是使用 - > {},那是一个lambda,对吧? scope :all_lazy, -> { select("*") }
如果我需要一个论点怎么办?我尝试了一些不同的想法,并在使用 - > {}时在控制台中获得参数错误。
我认为它应该是:
scope :find_lazy, -> (id) { where(id: id) }
Ruby也没有弃用旧式的lambda,所以如果你觉得通过各种方式使用它会更加舒服。
我本人并不喜欢自己的stabby lambda语法,但最终它们可能会成为常态,因此习惯它们并不会受到伤害。
Rails 4,你可以这样做:
scope :find_lazy, -> (id) { where(id: id) }
那是旧红宝石:
:id => id
更好的哈希:
id: id
我通常使用以下编程语法
scope :find_lazy, -> (id) { where(id: id) }
但是当我使用Codacy查看我的代码时,我发现它提醒我这个语法
Use the `lambda` method for multiline lambdas.
我改变了它,它运作良好
scope :find_lazy, lambda {|id|
where(id: id)
}
支持协会:
scope :find_lazy, -> (object) { where(object_id: object.id) }
scope :find_lazy, -> (id) { where(id: id) }
相当于
self.find_lazy(id)
where(id: id)
end
基于ruby on rails guide:Using a class method is the preferred way to accept arguments for scopes.
没有理由将范围与lambda一起使用,而不是类方法。这是个人喜好的问题。但是,如果要遵循这些准则,则应在涉及参数时使用类方法。