带有lambda和Rails 4风格的参数的范围?


144

我想知道在Rails 4中如何完成以下操作,或者我是否只是使用Rails 3方法来使用可以传递参数的lambda,而lambda可以像4一样传递参数,就像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的使用-> {}的方法,那就是lambda,对不对?scope :all_lazy, -> { select("*") }如果我需要吵架怎么办。我尝试了几种不同的想法,并在使用-> {}时在控制台中出现了参数错误。

Answers:


305

我认为应该是:

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

2
支持文档,特别是第14.1节。
丹尼斯

3
耶(Yay),帮我撰写scope :in_daterange, ->(start_date, end_date) { where(created_at: start_date.to_date.beginning_of_day..end_date.to_date.end_of_day) }
Epigene

4
请注意,如果您使用的是Ruby 1.9,则简短的lambda语法不允许在箭头和参数(scope :find_lazy, ->(param))之间留空格。在Ruby 2+中,允许使用空格。 更多信息在这里...
furman87

Ruby中的“现代” Syntexscope :find_lazy, -> id { where id: id }
Swordray

11

Ruby也没有弃用lambda的旧样式,因此,如果您感到更舒服地使用它,那就去吧。

我个人并不喜欢稳定的lambda的语法,但最终它们可能会成为标准,因此习惯它们不会有任何伤害。


6
我喜欢语法,但是将参数放在箭头和函数主体之间感觉很不对劲,尽管它本来应该是“(id)-> {where ...}”,但它会更具吸引力(并且不会违反我的数学知识或coffeescript语法)。最后,“->”表示将值映射到结果。
hurikhan77

我遇到了一种情况,其中在Rails 4.2中使用旧样式从数据库返回了不正确的布尔值。它可能尚未正式弃用,但是使用更新的语法解决了该问题。
stevenspiel 2015年

1
@ hurikhan77是的,令人不安的是该语法与CoffeeScript coffeescript.org/#functions
Chloe,

8

Rails 4,您可以执行以下操作:

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

那是在旧的红宝石里:

:id => id

更好的哈希:

id: id

5

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

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) }

1
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.

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.