Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么/如何仅通过Rails 3中的关联才能访问记录数组的类方法?_Ruby On Rails_Ruby On Rails 3_Activerecord_Active Relation - Fatal编程技术网

Ruby on rails 为什么/如何仅通过Rails 3中的关联才能访问记录数组的类方法?

Ruby on rails 为什么/如何仅通过Rails 3中的关联才能访问记录数组的类方法?,ruby-on-rails,ruby-on-rails-3,activerecord,active-relation,Ruby On Rails,Ruby On Rails 3,Activerecord,Active Relation,考虑一个简单的例子,我们有两个模型,文章和类别 class Article < ActiveRecord::Base belongs_to :category def self.search(title) where(:title => title) end end class Category < ActiveRecord::Base has_many :articles end 按预期返回一个错误 NoMethodError: undefine

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

class Article < ActiveRecord::Base
  belongs_to :category

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

class Category < ActiveRecord::Base
  has_many :articles
end
按预期返回一个错误

NoMethodError: undefined method `search' for #<Array:0x9aa207c>
返回一组记录

这将提示检查

 Article.all

两者都返回数组

显然,文章的类方法“search”是在运行时引入的,当通过其关联(类别)进行访问时,它会提示记录的“正确”返回,但当被类本身(文章)访问时,它的行为就不同了

那么,发生了什么事

Article.all
这将返回一个数组,该数组给出了错误,正如您所看到的,您正试图在
array
类上运行
Article
的class函数

我不确定你到底想实现什么,但我认为你可以做到

Article.search("soem content")

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

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

Category.first.articles.ancestors
vs

第二个会抛出一个错误,因为此时对象只是一个简单数组。然而,第一个由以下内容组成:

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] 
a=Category.first.articles;ObjectSpace.each_对象(类)。选择{| k | a[对象、基本对象、ActiveRecord::基本]

您可以看到,尽管它看起来像一个数组,但它继承了其他类。

Sorry@nvez,但这不是我想要的答案。我很清楚我想要完成什么,我只是很好奇为什么或者我发布的内容是如何发生的。啊!延迟加载。非常感谢。
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]