默认范围内的参数数量(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") }