147

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

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

4

6 回答 6

313

我认为应该是:

scope :find_lazy, -> (id) { where(id: id) }
于 2013-05-16T13:03:38.310 回答
11

Ruby 也没有弃用旧风格的 lambda,所以如果你觉得使用它更舒服,那就去吧。

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

于 2013-08-09T19:36:12.310 回答
8

Rails 4,你可以这样做:

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

那是在旧红宝石中:

:id => id

更好的哈希:

id: id
于 2015-11-27T13:03:44.483 回答
5

伙计,我通常使用以下编程语法

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

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

Use the `lambda` method for multiline lambdas.

我将其更改为并且运行良好

  scope :find_lazy, lambda {|id|
    where(id: id)
  }
于 2018-10-04T10:08:14.870 回答
2
scope :find_lazy, -> (id) { where(id: id) }

相当于

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

基于ruby​​ on rails 指南Using a class method is the preferred way to accept arguments for scopes.

没有理由将作用域与 lambdas 一起使用而不是类方法。这是个人喜好的问题。但是,如果你想遵循这些指导方针,你应该在涉及参数时使用类方法。

于 2019-03-07T12:01:40.867 回答
2

支持协会:

scope :find_lazy, -> (object) { where(object_id: object.id) }
于 2015-12-03T13:40:02.157 回答