为什么这段代码按照文档工作?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>
如果这种特殊行为在Rails 3中相同。就像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,因为这充其量是一个误导性的文档问题,或者最坏的情况是一个bug。
我最初的答案是正确的:它不能工作…
我想我终于说服了自己,因为医生应该统治…
好吧,我认为文档中重要的是思想:你可以用类方法链接作用域。
但是例子中给出的类方法的实现肯定是错误的。
这行得通,因为返回对象(AR::Relation)接受3种方法:
1) AR::关系的"本地"方法,如:where,:includes,:joins,:limit等
2)可枚举方法。它们中的大多数委托给作用域集合,即Array。
3)其他方法:通过'method_missing'
委托给基类因此,该部分的API文档(与类方法链接)是错误的:)