Ruby on rails 4 具有lambda的作用域和Rails 4样式的参数?

Ruby on rails 4 具有lambda的作用域和Rails 4样式的参数?,ruby-on-rails-4,scope,rails-activerecord,Ruby On Rails 4,Scope,Rails Activerecord,我想知道在Rails 4中是如何实现以下功能的,或者我是否只是使用Rails 3的方法来使用lambda,该lambda可以像我在3中一样在4中传递参数 我是Rails3的新手,正在尝试使用一些运行Rails4的示例 以下是我的Rails 3代码: class Person < ActiveRecord::Base scope :find_lazy, lambda {|id| where(:id => id)} end # In console I can call Perso

我想知道在Rails 4中是如何实现以下功能的,或者我是否只是使用Rails 3的方法来使用lambda,该lambda可以像我在3中一样在4中传递参数

我是Rails3的新手,正在尝试使用一些运行Rails4的示例

以下是我的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,对吗?范围:all_lazy,->{select*}如果我需要一个参数怎么办。我尝试了一些不同的想法,在控制台中使用->{}时出现了参数错误

我认为应该是:

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

Ruby也没有反对lambda的旧式风格,所以如果你觉得使用它更舒服,那就试试吧

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

Rails 4,您可以:

scope :find_lazy, -> (id) { where(id: id) }
那是在旧红宝石里:

:id => id
更好的散列:

id: id

为支持协会:

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

我通常使用下面的编程语法

scope :find_lazy, -> (id) { where(id: id) }
但当我使用Codacy检查代码时,我发现它提醒我注意这个语法

Use the `lambda` method for multiline lambdas.
我把它改成了,它工作得很好

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

self.find_lazy(id)
  where(id: id)
end
基于:使用类方法是接受作用域参数的首选方法


没有理由优先于类方法将作用域与lambda一起使用。这是个人喜好的问题。但是,如果您想遵循这些指导原则,那么在涉及参数时应该使用class方法

是的,帮助我编写了作用域:in_daterange,->start_date,end_date{where created_at:start_date.to_date.start_of_day..end_date.to_date.end_of_day}注意,如果使用Ruby 1.9,短lambda语法不允许箭头和参数scope之间有空格:find_lazy,->param。在Ruby 2+中,空间是允许的。Ruby scope中的现代syntex:find_lazy,->id{where id:id}我喜欢语法,但是把参数放在箭头和函数体之间感觉很错误,而它应该是id->{where…},这会更吸引人,不会破坏我的数学知识和coffeescript语法。最后->说了一些类似于将值映射到结果的内容。我遇到了这样一种情况:在Rails 4.2中使用旧样式时,从数据库返回了不正确的布尔值。它可能没有被正式弃用,但使用更新的语法解决了这个问题。@hurikhan77是的,语法与CoffeeScript冲突令人不安
self.find_lazy(id)
  where(id: id)
end