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

kap*_*lan 141 scope ruby-on-rails-4 rails-activerecord

我想知道如何在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)
Run Code Online (Sandbox Code Playgroud)

所以,如果这是Rails 4方式是使用 - > {},那是一个lambda,对吧?scope :all_lazy, -> { select("*") }如果我需要一个论点怎么办?我尝试了一些不同的想法,并在使用 - > {}时在控制台中获得参数错误.

lis*_*is2 300

我认为应该是

scope :find_lazy, -> (id) { where(id: id) }
Run Code Online (Sandbox Code Playgroud)

  • 是的,帮我写了`scope:in_daterange, - >(start_date,end_date){where(created_at:start_date.to_date.beginning_of_day..end_date.to_date.end_of_day)}` (3认同)
  • 请注意,如果您使用的是Ruby 1.9,则短lambda语法不允许箭头和参数之间的空格(`scope:find_lazy, - >(param)`).在Ruby 2+中,允许空间.[更多信息在这里...](http://ruby-journal.com/becareful-with-space-in-lambda-hash-rocket-syntax-between-ruby-1-dot-9-and-2-dot -0 /) (3认同)
  • [支持文件](http://guides.rubyonrails.org/active_record_querying.html#scopes),第14.1节具体说明. (2认同)

Bra*_*lva 10

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

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

  • 我喜欢语法,但是将参数放在箭头和函数体之间是完全错误的,而它应该是"(id) - > {where ...}"这将更具吸引力(并且不会打破我的数学知识和coffeescript语法).最后," - >"表示将值映射到结果. (6认同)

小智 7

Rails 4,你可以这样做:

scope :find_lazy, -> (id) { where(id: id) }
Run Code Online (Sandbox Code Playgroud)

那是旧红宝石:

:id => id
Run Code Online (Sandbox Code Playgroud)

更好的哈希:

id: id
Run Code Online (Sandbox Code Playgroud)


Ast*_*stm 5

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

scope :find_lazy, -> (id) { where(id: id) }
Run Code Online (Sandbox Code Playgroud)

但是,当我使用Codacy查看代码时,发现它提醒我有关此语法的信息

Use the `lambda` method for multiline lambdas.
Run Code Online (Sandbox Code Playgroud)

我将其更改为工作正常

  scope :find_lazy, lambda {|id|
    where(id: id)
  }
Run Code Online (Sandbox Code Playgroud)