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]