ruby on rails - ActiveRecord::Relation上的类方法调用是如何接受上下文的?



为什么这段代码按照文档工作?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文档(与类方法链接)是错误的:)

相关内容

  • 没有找到相关文章

最新更新