我想知道如何在Rails 4中完成以下操作,或者我是否只使用Rails 3方法来使用lambda,它可以使用与3相同的方式传递参数。
我是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的方式是使用 - &gt; {},这是一个lambda,对吧? scope :all_lazy, -> { select("*") }
如果我需要一个论点怎么办?在使用 - &gt;时,我尝试了一些不同的想法并在控制台中出现参数错误。 {}。
答案 0 :(得分:293)
我认为应该是:
scope :find_lazy, -> (id) { where(id: id) }
答案 1 :(得分:10)
Ruby也没有弃用旧式的lambda,所以如果你觉得使用它会更加舒服,那就去吧。
我个人并不喜欢自己的stabby lambda语法,但最终它们可能会成为常态,所以习惯它们并不会受到伤害。
答案 2 :(得分:7)
Rails 4,你可以这样做:
scope :find_lazy, -> (id) { where(id: id) }
那是旧红宝石:
:id => id
更好的哈希:
id: id
答案 3 :(得分:2)
支持协会:
scope :find_lazy, -> (object) { where(object_id: object.id) }
答案 4 :(得分:2)
伙计,我通常使用以下编程语法
scope :find_lazy, -> (id) { where(id: id) }
但是当我使用Codacy查看我的代码时,发现它提醒我这种语法
Use the `lambda` method for multiline lambdas.
我将其更改为,并且效果很好
scope :find_lazy, lambda {|id|
where(id: id)
}
答案 5 :(得分:0)
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一起使用,而不是使用类方法。这是个人喜好问题。但是,如果要遵循准则,则在涉及参数时应使用class方法。