我有以下代码:
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类中无法访问子类的根关联,有没有办法提高性能?
答案 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"