使用 lambda 的作用域和 Rails 4样式的参数?

我想知道下面的内容是如何在 Rails 4中完成的,或者我只是使用 Rails 3方法来使用一个 lambda,它可以像我使用3那样使用4来传递参数。

我对 Rails3还是个新手,正在尝试处理一些运行 Rails4的示例。

下面是我的 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,对吗?如果我需要一个论点。我尝试了一些不同的想法,在使用-> {}时在控制台中出现了参数错误。

102086 次浏览

我认为应该是:

scope :find_lazy, -> (id) { where(id: id) }

Ruby 也没有反对旧的 lambda 风格,所以如果您觉得使用这种风格更舒服的话,请尽管使用它。

我个人并不喜欢刺的 lambda 的语法,但是最终它们可能会成为规范,所以习惯它们并没有什么坏处。

Rails 4,你可以这样做:

scope :find_lazy, -> (id) { where(id: id) }

那是在旧红宝石里:

:id => id

更好的杂烩:

id: id

支持协会:

scope :find_lazy, -> (object) { where(object_id: object.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, -> (id) { where(id: id) }

等同于

self.find_lazy(id)
where(id: id)
end

基于 导轨上的红宝石导轨: Using a class method is the preferred way to accept arguments for scopes.

没有理由优先使用作用域和 lambdas 而不是类方法。这是个人喜好的问题。但是,如果您希望遵循指导原则,那么当涉及到参数时,应该使用 class 方法。