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

问题描述 投票:139回答:6

我想知道如何在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("*") }如果我需要一个论点怎么办?我尝试了一些不同的想法,并在使用 - > {}时在控制台中获得参数错误。

ruby-on-rails-4 scope rails-activerecord
6个回答
296
投票

我认为它应该是:

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

10
投票

Ruby也没有弃用旧式的lambda,所以如果你觉得通过各种方式使用它会更加舒服。

我本人并不喜欢自己的stabby lambda语法,但最终它们可能会成为常态,因此习惯它们并不会受到伤害。


7
投票

Rails 4,你可以这样做:

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

那是旧红宝石:

:id => id

更好的哈希:

id: id

3
投票

我通常使用以下编程语法

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

但是当我使用Codacy查看我的代码时,我发现它提醒我这个语法

Use the `lambda` method for multiline lambdas.

我改变了它,它运作良好

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

2
投票

支持协会:

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

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一起使用,而不是类方法。这是个人喜好的问题。但是,如果要遵循这些准则,则应在涉及参数时使用类方法。

© www.soinside.com 2019 - 2024. All rights reserved.