1

为什么根据文档的代码有效? http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html

class Article < ActiveRecord::Base
  scope :featured, where(:featured => true)

  def self.titles
    map(&:title)
  end
end

Article.featured.titles

在我的控制台中得到:

NoMethodError: undefined method `map' for #<Class:0xb70bfb0>
4

3 回答 3

2

如果此特定行为在 Rails 3.x 中与在 Rails 4.x 中相同,那么您可以尝试:

class Article < ActiveRecord::Base
  scope :featured, where(:featured => true)

  def self.titles
    all.map(&:title)
  end
end

Article.featured.titles

由@Nermin 提供的用于收集对象的 Rails 模型类方法中的回答,并在此处复制以供后代使用。骗人的,但也许不是因为我相信 Rails 版本是不同的。

顺便说一句,我还提交了https://github.com/rails/rails/issues/21943 ,因为这充其量是一个误导性的文档问题,或者最坏的情况是一个错误。

于 2015-10-13T03:56:12.883 回答
1

我最初的答案是正确的:它不能工作......

我想我终于说服了自己,因为文档应该统治......

好吧,我认为文档中重要的是这个想法:您可以将作用域与类方法链接起来。

但是示例中给出的类方法的实现肯定是错误的。

于 2013-01-07T12:35:47.117 回答
1

这是因为返回的对象 (AR::Relation) 接受 3 种方法:

1) AR::Relation 'native' 方法,例如 :where、:includes、:joins、:limit 等...

2) 可枚举的方法。它们中的大多数委托给范围集合,即 Array。

3)其他方法:通过' method_missing '委托给基类

因此,该部分的 API 文档(与类方法链接)是错误的 :)

于 2013-01-07T13:57:16.360 回答