Rails 3.0 - 使用Proc的default_scope不起作用

时间:2014-08-04 10:10:45

标签: ruby-on-rails ruby-on-rails-3 activerecord activeadmin default-scope

我在Rails 3.0上编写了大项目。

该项目的最大模型是Questinary。它作为所有典型模型从ActiveRecord :: Base继承而来。该模型的许多部分都被转移到从Questionary继承的单独模型中。

我在这些模型中有范围问题。问题是ActiveRecord没有理解范围然后他们使用Procs。具有Procs到Questinary模型的范围本身可以正常工作。此外,所有罚款范围都不包含Proc。

错误讯息为undefined method 'includes_values' for #<Proc:0x000000081cde98>

回溯:

activerecord (3.0.20) lib/active_record/relation/spawn_methods.rb:11:in `block in merge'
activerecord (3.0.20) lib/active_record/relation/spawn_methods.rb:10:in `each'
activerecord (3.0.20) lib/active_record/relation/spawn_methods.rb:10:in `merge'
activerecord (3.0.20) lib/active_record/named_scope.rb:32:in `scoped'
activerecord (3.0.20) lib/active_record/base.rb:449:in `rescue in order'
activerecord (3.0.20) lib/active_record/base.rb:447:in `order'
/home/sergey/.rvm/gems/ruby-1.9.3-p484/bundler/gems/active_admin-534e909fe7dc/lib/active_admin/resource_controller/collection.rb:51:in `sort_order'
/home/sergey/.rvm/gems/ruby-1.9.3-p484/bundler/gems/active_admin-534e909fe7dc/lib/active_admin/resource_controller/collection.rb:44:in `active_admin_collection'
/home/sergey/.rvm/gems/ruby-1.9.3-p484/bundler/gems/active_admin-534e909fe7dc/lib/active_admin/resource_controller/collection.rb:63:in `active_admin_collection'
/home/sergey/.rvm/gems/ruby-1.9.3-p484/bundler/gems/active_admin-534e909fe7dc/lib/active_admin/resource_controller/collection.rb:86:in `active_admin_collection'
/home/sergey/.rvm/gems/ruby-1.9.3-p484/bundler/gems/active_admin-534e909fe7dc/lib/active_admin/resource_controller/collection.rb:114:in `active_admin_collection'
/home/sergey/.rvm/gems/ruby-1.9.3-p484/bundler/gems/active_admin-534e909fe7dc/lib/active_admin/resource_controller/collection.rb:17:in `collection'
inherited_resources (1.2.2) lib/inherited_resources/actions.rb:7:in `index'
/home/sergey/.rvm/gems/ruby-1.9.3-p484/bundler/gems/active_admin-534e909fe7dc/lib/active_admin/resource_controller/actions.rb:11:in `index'
app/admin/questionary_scope_uni_groups.rb:216:in `index'

正如您可以看到从ActiveAdmin调用ActiveRecord,因此问题可能与它有关。

Rails version: 3.0.20
ActiveAdmin version: 0.3.4

我知道旧的宝石版本并不好,但我无法更新它们,因为它会破坏应用程序。

大约一年前,那些东西运行良好,但后来服务器被拆解了。现在我需要恢复它。

更新

范围示例:

default_scope proc { where(:status => "reviewed") }

1 个答案:

答案 0 :(得分:0)

default_scope写的问题是:

default_scope proc { where(:status => "reviewed") }

我不可能只删除proc(即default_scope where(:status => "reviewed")。因为在这种情况下,ActiveRecord尝试访问数据库,但我的应用程序中的数据库并不是所有时间都可用。

所以我需要一种懒惰的方式来使用default_scope。

@ andrey的建议(scope :default_scope, lambda { where(:status => "reviewed") })不合适,因为涉及调用默认范围的所有代码的更改。

我尝试使用block而不是proc(即default_scope { where(:status => "reviewed") })但是在Rails 3.0中我没有取得成功。

所以我将default_scope定义为类方法:

def self.default_scope
  where(:status => "reviewed")
end

这完全符合我的需要。