我有这些表:
类别:id,name,parent_id
CategoryImage:id,url,category_id
category_ImageHistory:id,user_id,category_image_id
Category的parent_id是另一个Category记录(自引用(的外键
我想加载所有类别,从顶级到儿童,以及他们的图像和图像历史:
Category.where(parent_id: nil)
.includes(category_image: :category_image_history, children: [category_image: :category_image_history])
这将产生以下SQL语句:
SELECT categories.* FROM categories WHERE parent_id is NULL
SELECT category_images.* FROM category_images WHERE category_images.category_id IN (..)
SELECT category_image_histories.* FROM category_image_histories WHERE category_image_histories.category_image_id IN (..)
SELECT categories.* FROM categories WHERE categories.parent_id IN (..)
SELECT category_images.* FROM category_images WHERE category_images.category_id IN (..)
SELECT category_image_histories.* FROM category_image_histories WHERE category_image_histories.category_image_id IN (..)
category_images和category_image_histories查询重复,因为首先,我们搜索顶级类别,然后搜索这些类别图像,然后搜索历史,然后搜索子类,然后搜索类别图像,再搜索历史。
有没有Rails的方法可以优化这一点?一种方法可以让它按类别、子类别、所有图像和图像历史记录进行搜索,但仍然可以很好地排列结果。现在,此代码返回一个顶级类别的数组,每个类别都将正确响应.children、.category_images和.category_image_histories。感谢
我不知道你想要在结果中有什么顺序。我想你想要这样的订单:parent_1、child_1_parent_1、child_2_parent_2、parent_2、child_1-parent_2,。。。
和
我想你没有一个孩子有parent_id
:
Category.left_joins(:children).order('NVL(children_categories.id, categories.id), categories.id DESC')
.includes(category_image: :category_image_history)
请检查children_categories
是否是关联的正确名称。我不能百分之百肯定