ruby-on-rails - "taken"是 ruby​​ 中的关键字吗?

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

直接进入问题。 我有这样的查询:

@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 似乎被定义为 Arel::SelectorManagerlimit 的别名,ActiveRecord 的依赖项

关于ruby-on-rails - "taken"是 ruby​​ 中的关键字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13331903/

相关文章:

sql - rails ActiveRecord : Find from ActiveRecord result in O(1) time

ruby-on-rails - 没有要加载的文件 -- bundle 程序 (LoadError)

ruby-on-rails - 如何在 elasticsearch-rails 中将 "search_type"设置为 "count"?

ruby - 如何设置 Hook 以在 Ruby 类定义的末尾运行代码?

android - 我可以使用 lambda 表达式来替换仅用一个抽象方法实例化抽象类吗?

c# - 删除集合中的重复值

mysql - 根据 Rails 中的最后 has_many 记录排序

ruby-on-rails - 安装 rdiscount (2.2.0.1) 时出错,Bundler 无法在 Mac OS 和 Ruby 2.7.1 上继续

ruby-on-rails - Bundle Install 无法从 https ://rubygems. org/获取规范

c# - .NET - 将语句 lambda 主体转储到字符串