2

考虑一个简单的例子,我们有 2 个模型,文章和类别。

class Article < ActiveRecord::Base
  belongs_to :category

  def self.search(title)
    where(:title => title)
  end
end

class Category < ActiveRecord::Base
  has_many :articles
end

现在,在 rails 控制台上:

Article.all.search('test article')

正如预期的那样返回错误

NoMethodError: undefined method `search' for #<Array:0x9aa207c>

但是当我这样做时

Category.first.articles.search('test article')

返回一组记录!

这会提示检查类

 Article.all

Category.first.articles

都返回Array类。

显然,Article 的类方法“search”在运行时被引入,并在通过其关联(Category)访问时提示记录的“正确”返回,但在被类本身访问时(Article)表现不同。

那么,发生了什么事?

4

2 回答 2

2

这是因为当你执行.all查询时实际上是执行的,所以返回的对象将是一个基本数组。但是,当你执行时Category.first,它会返回一个 Category 对象,然后articles实际上是在使用ActiveRecord::Reflection::AssociationReflection和扩展一个 Array。例如,在rails c尝试中:

Category.first.articles.ancestors

对比

Category.first.articles.all.ancestors #throws an error

第二个抛出错误,因为此时对象只是一个简单的数组。然而,第一个是由这样的东西组成的:

Article(...), ActiveRecord::Base, ActiveRecord::Reflection, Object (and so on)

作为另一个例子,试试这个:

a = Category.first.articles; ObjectSpace.each_object(Class).select {|k| a < k }
#=> [Object, BasicObject, ActiveRecord::Base] 

您可以看到,虽然它看起来像一个数组,但它继承了那些其他类。

于 2011-03-29T18:29:56.323 回答
0
Article.all

如您所见,这将返回一个给您错误的数组,您正在尝试在该类Article上运行一个类函数Array

我不确定您到底要完成什么,但我认为您可以做到这一点

Article.search("soem content")

但是,我不确定这是否会返回结果,因为它可能只返回一个

于 2011-03-29T17:57:47.627 回答