在Rails 4风格中使用lambda和参数的范围?

时间:2013-05-16 12:56:14

标签: ruby-on-rails-4 scope rails-activerecord

我想知道如何在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;时,我尝试了一些不同的想法并在控制台中出现参数错误。 {}。

6 个答案:

答案 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 guideUsing a class method is the preferred way to accept arguments for scopes.

没有理由将范围与lambda一起使用,而不是使用类方法。这是个人喜好问题。但是,如果要遵循准则,则在涉及参数时应使用class方法。