在红宝石中被“采取”关键字?

时间:2012-11-11 14:14:42

标签: ruby-on-rails ruby lambda named-scope

直截了当地提问。 我有这样的查询:

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

其中taken是named_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是ruby中的关键字吗?如果没有人可以解释这种行为吗?

1 个答案:

答案 0 :(得分: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似乎被定义为limitArel::SelectorManager的别名,ActiveRecord的依赖关系。