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

Rat*_*lle 2 ruby lambda named-scope ruby-on-rails

直截了当的问题.我有这样的查询:

@issue_books = current_user.issue_books
@already_issues =  @issue_books.taken(params[:id])
Run Code Online (Sandbox Code Playgroud)

takennamed_scope 在哪里定义如下:

scope :taken, lambda { |book_id| where(returned: false).where(book_id: book_id)  }
Run Code Online (Sandbox Code Playgroud)

现在每次我运行此查询:

@issue_books.taken(params[:id]) 
Run Code Online (Sandbox Code Playgroud)

我收到一个ArgumentError: wrong number of arguments (1 for 0)错误.

如果我重命名taken为其他东西taken_books,似乎一切正常.

所以我的问题是:takenruby中的关键字是什么?如果没有人可以解释这种行为?

Jea*_*ano 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
Run Code Online (Sandbox Code Playgroud)

因此,taken您定义的范围可能会被定义中的定义所掩盖ActiveRecord::Delegate.

更新:我做了一些挖掘,taken似乎被定义为limitin的一个别名Arel::SelectorManager,一个依赖ActiveRecord.