直接回答问题。
我有这样的疑问:

@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似乎被定义为takenlimit的别名,这是Arel::SelectorManager的依赖项。

10-07 15:28