Rails包含用于自引用关联的



我有这些表:

类别: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是否是关联的正确名称。我不能百分之百肯定

相关内容

  • 没有找到相关文章

最新更新