如何在子类中加载关联

时间:2013-12-30 12:04:55

标签: ruby-on-rails

我有以下代码:

class Parent < ActiveRecord::Base
   # attributes  name:string, root_id:integer , type:string , .....
   has_many :childrens, class_name: 'Children, foreign_key: :root_id, primary_key: :id
end

和另一个孩子一起

class Children < Parent
   belongs_to :root, class_name: 'Parent', foreign_key: :root_id, primary_key: :id
end

Parent个对象可以在同一个表中显示multiple times出于某种原因... ),但我不会重复行并每次都复制所有信息,所以我只创建了从Children继承的Parent子类,root_id是父项的reference,例如:

object 1 :  { id: 1 , name: "parent object", root_id: nil, type: nil, .... }
object 2 : {id: 2, name: "child", root_id: 1, type: 'Children', ....}
object 3 : {id: 3, name: "child", root_id: 1, type: 'Children', ... }

然后我做这样的事情:

Parent.where("id IN (2, 3)")

这里我只获取'儿童'对象,所以我想急切加载他们的父母,访问该名称,以及其他属性......

我试过这个

Parent.where("id IN (2, 3)").includes(:root) 

但是我收到了这个错误:

Association named 'root' was not found on Parent; perhaps you misspelled it?
看来:在Parent类中无法访问子类的根关联,有没有办法提高性能?

1 个答案:

答案 0 :(得分:1)

简单。 includes方法接受您为类定义的关联。在你的情况下,它只需要:儿童(它实际上应该是没有's'的孩子)。

因此,为了使include方法可用,将Children(它实际上应该是Child)类中的belongs_to关联剪切并粘贴到Parent类,如下所示。

class Parent < ActiveRecord::Base
   has_many :childrens, class_name: 'Children, foreign_key: :root_id, primary_key: :id
   belongs_to :root, class_name: 'Parent', foreign_key: :root_id, primary_key: :id
end

现在,以下情况可以假设,您没有其他问题。

Parent.where("id IN (2, 3)").includes(:root) 

提示:

1.9.3p385 :007 > "Child".pluralize
 => "Children" 
1.9.3p385 :008 > "Children".singularize
 => "Child"