首页 > 解决方案 > 对列进行 api 调用时,如何从同一个表的另一列侧加载某些内容?

问题描述

假设我有一个任务表,其中包含两个属性,一个作为 Id,另一个作为父 id 以及其他属性。

现在我有两种类型的任务:一种是主任务,其父我为空,另一种类型的任务是子任务,其父我将作为它所属的同一个表中的另一个任务。我可以创建一个既作为任务也作为子任务的任务(提供哪个任务是它的父任务)

当我调用 api 来获取任务时,我会基于过滤器加载所有属性和关联的表。

过滤器还可以选择显示父任务 id 和 parent_task_name。

但是这里的问题是,由于它们在同一个表中,所以 api 调用不是侧加载同一个表本身,而是进行额外调用以再次加载 parent_task 列。

我知道我们可以在一开始就创建两个表,一个作为任务,另一个作为子任务,但现在这是不可行的。

那么我如何避免额外的 api 调用只是为了获取 parent_task_name 并在同一个 api 调用中加载父任务 ID 及其名称。

标签: mysqlruby-on-railsjsonapirest

解决方案


由于您尚未共享代码,因此不确定您是如何尝试这样做的,但我能想到的一种方法是使用连接:

records = ChildModel.joins('INNER JOIN task_table AS parent ON task_table.parent_id = parent.id').select('task_table.*, parent.name AS parent_task_name').where(id: array_of_ids)

task_table将是您的表的名称。

因此,我们在这里使用别名将表与自身连接起来,并从中获取父任务属性。要获取父任务名称:

records.last.parent_task_name

这样,您将在单个查询中获取记录。


推荐阅读