我在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") }
答案 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
这完全符合我的需要。