2

直奔问题。我有一个这样的查询:

@issue_books = current_user.issue_books
@already_issues =  @issue_books.taken(params[:id])

其中takennamed_scope定义如下:

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红宝石中的关键字是什么?如果没有,任何人都可以解释这种行为吗?

4

1 回答 1

6

它不是 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似乎被定义为limitin的别名Arel::SelectorManager,是ActiveRecord.

于 2012-11-11T14:26:03.180 回答