与拉姆达和参数在轨道4,5的风格范围?(scopes with lambda and argumen

2019-09-03 17:25发布

我想知道如何下面是Rails中4完成,或者如果我只是用了Rails 3的方法使用Lambda可以传递参数以同样的方式与4,因为我用3做。

我很新到Rails 3并试图通过一些样品的工作运行轨道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的方法是使用 - > {},这是一个拉姆达,对不对? scope :all_lazy, -> { select("*") }如果我需要的参数。 我尝试了一些不同的想法,并在控制台中获取参数的错误使用时 - > {}。

Answer 1:

我认为它应该是

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


Answer 2:

红宝石并没有过时拉姆达的老式要么,所以如果你使用的一切手段去为它感到更舒适。

我不亲自喜欢stabby拉姆达的语法自己,但最终他们可能会成为一种常态,因此不会伤害到习惯他们。



Answer 3:

轨道4,你可以这样做:

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

这是在旧的红宝石:

:id => id

更好的哈希:

id: id


Answer 4:

为了支持协会:

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


Answer 5:

家伙我通常使用下面的编程语法

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

但是,当我正在审查使用Codacy我的代码,我发现它提醒我这句法

Use the `lambda` method for multiline lambdas.

我改变了它是和它运作良好

  scope :find_lazy, lambda {|id|
    where(id: id)
  }


Answer 6:

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.

没有理由与lambda表达式优先一起使用范围类的方法。 这是个人喜好的问题。 但是,如果你要遵循的准则,你应该使用类方法的参数时涉及。



文章来源: scopes with lambda and arguments in Rails 4 style?