在Rails中,我正试图加载一些东西来加速它。我有一个Parent-Child-Grandchild情况,但只需要Parent和Grandchild的属性。如果我......
Parent.all.includes(:child => :grandchild)
然后Bullet抱怨孩子未使用的急切负荷(这是真的,我不需要它)。是否有更简单的方法可以访问父记录和Grandchild.some_attribute?
答案 0 :(得分:3)
几个选项......
1)在父项上缓存grand-child的值(对数据库进行非规范化,添加列并存储属性)。如果只有一个孙子,并且您希望在父母很多的情况下经常显示此值,请执行此操作。
2)你能做一个has_many:通过孙子吗?然后你可以做一个include(:grandchildren)
。这可能会节省生成子对象。
3)如果它确实是子孙(has_ones或belongs_to),您可能会找到一种基于父ID在孙子上进行查询(或范围)的简单方法。然后,您可以运行两个查询,一个用于获取parent.all,一个用于获取grandchild.grandchild_of(parents.map(&:id))
,然后在ruby中循环并将该属性作为属性添加到父级,以便在稍后循环访问父级时使用。
4)最后,执行特定的手工sql查询以选择父属性和grandchild.attribute。该属性将附加到父级,并可由parent.grandchild_attribute_name访问。 Parent.select('parents.*, grandchild.attribute').joins(:grandchild)
。根据您的型号,您需要进行试验。