43

I'm working through the 'Ruby On Rails 3 Essential Training' and have received a problem when using name scopes. When finding records and using queries withing the Rails console everything went smoothly until I tried to use a name scope in my subject.rb file. This is my code in the subject.rb file.

Class Subject < ActiveRecord::Base

  scope :visible, where(:visible => true)

end   

I saved the .rb file and restarted my Rails console but when I run from my rails console:

subjects = Subject.visible

I get: ArgumentError: The scope body needs to be callable.

Does anyone know why I'm getting this error.

4

4 回答 4

84

范围的主体需要包裹在诸如 Proc 或 Lambda 之类的可调用对象中:

scope :visible, -> {
  where(:visible => true)
}

这样做的原因是它确保每次使用范围时都会评估块的内容。

于 2015-03-09T23:04:25.603 回答
6

我得到了同样的错误,而在我的解决方案之前,我在下面有where一个(空格

scope :registered , -> { where ( place_id:  :place_id , is_registered: :true ) }

在我删除了where(下面的空格之后,我让我的页面正常工作

scope :registered , -> { where( place_id:  :place_id , is_registered: :true ) }
于 2015-10-15T10:49:19.310 回答
3

是的,确实,这是 rails 4 调用范围的方式。如果您要从 Rails 3 升级到 Rails 4,则需要更改它。

于 2015-09-15T15:22:00.553 回答
0

你正在使用什么:scope :visible, where(:visible => true)用于急切加载,并且在 Rails 4 中已被弃用。

scope :visible, where(:visible => true)

这行代码在加载特定类时被评估,而不是当时,这scope就是被调用的

在某些情况下,这件事确实很重要,例如:

scope :future, where('published_at > ?', Time.now)
scope :future, -> { where('published_at > ?', Time.now) }

在第一种情况下,?将替换为加载类的时间,但在第二种正确的情况下,将使用在类上调用范围的时间。

于 2016-08-26T05:14:10.707 回答