直接回答问题。
我有这样的疑问:
@issue_books = current_user.issue_books
@already_issues = @issue_books.taken(params[:id])
其中
taken
是一个命名范围,定义如下:scope :taken, lambda { |book_id| where(returned: false).where(book_id: book_id) }
现在每当我运行此查询时:
@issue_books.taken(params[:id])
我得到一个
ArgumentError: wrong number of arguments (1 for 0)
错误。如果我将
taken
重命名为类似于taken_books
的其他名称,一切似乎都可以正常工作。所以我的问题是:
taken
是ruby中的关键字吗?如果没有谁能解释这种行为? 最佳答案
它不是ruby关键字,但似乎是在作用域上定义的方法。
试试这个:
@issue_books.method(:taken).owner
#=> ActiveRecord::Delegation
@issue_books.method(:taken).source_location
#=> (...)/gems/activerecord-3.2.6/lib/active_record/relation/delegation.rb
因此,您定义的范围可能被
taken
中的定义所覆盖。更新:
我做了一些挖掘,并且
ActiveRecord::Delegate
似乎被定义为taken
中limit
的别名,这是Arel::SelectorManager
的依赖项。