默认范围内的参数数量(0表示1)错误
我一直收到错误ArgumentError: wrong number of arguments (0 for 1)
我的default_scope
ArgumentError: wrong number of arguments (0 for 1)
,这是default_scope { where("#{table_name}.tenant_id IS NULL") }
它一直给我这个错误,我不明白为什么。 我的用户模型中有默认范围。
更新:
使用rails console时输出错误:
ArgumentError: wrong number of arguments (0 for 1) from /home/evan/Apps/demo-application/app/models/user.rb:18:in `hash' from /home/evan/.rvm/gems/ruby-2.0.0-p195/gems/activerecord-4.0.4/lib/active_record/scoping.rb:64:in `value_for' from /home/evan/.rvm/gems/ruby-2.0.0-p195/gems/activesupport-4.0.4/lib/active_support/per_thread_registry.rb:40:in `public_send' from /home/evan/.rvm/gems/ruby-2.0.0-p195/gems/activesupport-4.0.4/lib/active_support/per_thread_registry.rb:40:in `block in method_missing' from /home/evan/.rvm/gems/ruby-2.0.0-p195/gems/activerecord-4.0.4/lib/active_record/scoping/default.rb:123:in `ignore_default_scope?' from /home/evan/.rvm/gems/ruby-2.0.0-p195/gems/activerecord-4.0.4/lib/active_record/scoping/default.rb:134:in `evaluate_default_scope' from /home/evan/.rvm/gems/ruby-2.0.0-p195/gems/activerecord-4.0.4/lib/active_record/scoping/default.rb:110:in `build_default_scope' from /home/evan/.rvm/gems/ruby-2.0.0-p195/gems/activerecord-4.0.4/lib/active_record/relation.rb:554:in `with_default_scope' from /home/evan/.rvm/gems/ruby-2.0.0-p195/gems/activerecord-4.0.4/lib/active_record/relation.rb:582:in `exec_queries' from /home/evan/.rvm/gems/ruby-2.0.0-p195/gems/activerecord-4.0.4/lib/active_record/relation.rb:471:in `load' from /home/evan/.rvm/gems/ruby-2.0.0-p195/gems/activerecord-4.0.4/lib/active_record/relation.rb:220:in `to_a' from /home/evan/.rvm/gems/ruby-2.0.0-p195/gems/activerecord-4.0.4/lib/active_record/relation.rb:573:in `inspect' from /home/evan/.rvm/gems/ruby-2.0.0-p195/gems/railties-4.0.4/lib/rails/commands/console.rb:90:in `start' from /home/evan/.rvm/gems/ruby-2.0.0-p195/gems/railties-4.0.4/lib/rails/commands/console.rb:9:in `start' from /home/evan/.rvm/gems/ruby-2.0.0-p195/gems/railties-4.0.4/lib/rails/commands.rb:62:in `' from bin/rails:4:in `require'
hash
在我的用户模型中,如下所示。
def User.new_remember_token SecureRandom.urlsafe_base64 end def User.hash(token) Digest::SHA1.hexdigest(token.to_s) end private def create_remember_token self.remember_token = User.hash(User.new_remember_token) end
使用rails服务器时输出错误:
ArgumentError - wrong number of arguments (0 for 1): activerecord (4.0.4) lib/active_record/scoping.rb:70:in `set_value_for' activesupport (4.0.4) lib/active_support/per_thread_registry.rb:40:in `block in method_missing' activerecord (4.0.4) lib/active_record/scoping/default.rb:127:in `ignore_default_scope=' activerecord (4.0.4) lib/active_record/scoping/default.rb:140:in `ensure in evaluate_default_scope' activerecord (4.0.4) lib/active_record/scoping/default.rb:140:in `evaluate_default_scope' activerecord (4.0.4) lib/active_record/scoping/default.rb:110:in `build_default_scope' activerecord (4.0.4) lib/active_record/relation.rb:554:in `with_default_scope' activerecord (4.0.4) lib/active_record/relation.rb:582:in `exec_queries' activerecord (4.0.4) lib/active_record/relation.rb:471:in `load' activerecord (4.0.4) lib/active_record/relation.rb:220:in `to_a' activerecord (4.0.4) lib/active_record/relation/finder_methods.rb:316:in `find_take' activerecord (4.0.4) lib/active_record/relation/finder_methods.rb:66:in `take' activerecord (4.0.4) lib/active_record/relation/finder_methods.rb:49:in `find_by' activerecord (4.0.4) lib/active_record/querying.rb:6:in `find_by' app/helpers/sessions_helper.rb:16:in `current_user' app/helpers/sessions_helper.rb:19:in `signed_in?'
以及相关的rails方法:
def ignore_default_scope? # :nodoc: ScopeRegistry.value_for(:ignore_default_scope, self) end def ignore_default_scope=(ignore) # :nodoc: ScopeRegistry.set_value_for(:ignore_default_scope, self, ignore) end
你应该避免覆盖像Object#hash
这样的Ruby核心方法,同时考虑到Object#hash
是Ruby中必不可少的方法。 来自文档:
为此对象生成Fixnum哈希值。 此函数必须具有a.eql?(b)暗示a.hash == b.hash的属性。
哈希值与eql一起使用? 由Hash类确定两个对象是否引用相同的哈希键。 任何超出Fixnum容量的哈希值在被使用之前都将被截断。
对于ruby的调用或实现,对象的哈希值可能不相同。 如果您需要跨ruby调用和实现的稳定标识符,则需要使用自定义方法生成一个标识符。
如果你真的必须覆盖核心方法,你应该保证它们的function并且不要改变它们的参数 :否则你将在你的应用程序中得到意想不到的行为,就像你所指的错误一样。
我认为你没有table_name
这样的变量或方法
我认为这会奏效:
table name = "users" default_scope { where("#{table_name}.tenant_id IS NULL") }
使用可调用对象作为范围(它们正在等待它)也更清晰,所以最好在这里使用lambda:
table name = "users" default_scope ->{ where("#{table_name}.tenant_id IS NULL") } # or old syntax: default_scope lambda { where("#{table_name}.tenant_id IS NULL") }