Sql 具有多条记录的Rails复杂查询设置

Sql 具有多条记录的Rails复杂查询设置,sql,ruby-on-rails,postgresql,Sql,Ruby On Rails,Postgresql,我试图弄清楚如何在rails中执行查询,其中包含从另一个查询返回的多个ID。我有一张食物表,里面有很多化合物。我想做的是得到一份与原始食物至少有一种化合物的食物清单。目前我有以下几点: 要从最初的食物中获得化合物,我有以下几点: def set_food @food = Food.includes(:compounds).find(params[:id]) end 这设置了食物和化合物,我可以通过调用每个来输出所有内容,并显示每种食物中的化合物。所以下一步我不知道该怎么做是

我试图弄清楚如何在rails中执行查询,其中包含从另一个查询返回的多个ID。我有一张食物表,里面有很多化合物。我想做的是得到一份与原始食物至少有一种化合物的食物清单。目前我有以下几点:

要从最初的食物中获得化合物,我有以下几点:

def set_food
      @food = Food.includes(:compounds).find(params[:id])
    end
这设置了食物和化合物,我可以通过调用每个来输出所有内容,并显示每种食物中的化合物。所以下一步我不知道该怎么做是如何从内容表中获取所有的食物id,其中化合物id等于上面返回的原始内容中的一个,希望这是有意义的。所以像这样的事情我知道这是不对的

def show
    @pairs = Food.joins(:contents).where(contents: {compound_id: @food.contents.compound_id})
  end

任何帮助都将不胜感激,尝试用谷歌搜索答案,但甚至不确定要用谷歌搜索什么才能找到正确的方向

你已经迫不及待地在获取@food的同时加载了化合物,因此你可以分两步完成:

首先,获取与原始食物相关的所有有趣的化合物ID:

我认为通过AR关系,您甚至应该能够做到:

# worth the try
compound_ids = @food.compound_ids
第二步,您基本上使用了与以前相同的查询:

{component_id:[array]}应该在语句中转换为SQL,如:contents.component_id IN 1,2,3


这是最简单的方法,无需进入子查询等等。

在获取@food时,您已经迫不及待地加载了化合物,因此可以分两步完成:

首先,获取与原始食物相关的所有有趣的化合物ID:

我认为通过AR关系,您甚至应该能够做到:

# worth the try
compound_ids = @food.compound_ids
第二步,您基本上使用了与以前相同的查询:

{component_id:[array]}应该在语句中转换为SQL,如:contents.component_id IN 1,2,3


这是最简单的方法,无需进入子查询等等。

您也可以使用如下子查询:

@pairs=食物。连接:contents.wherecontents:{component\u id: @食品.化合物.选择:id} 然后您会得到一个类似以下内容的查询:

从“内容”上的“食品”内部连接“内容”中选择“食品”。“食品id”= `食品`.`id`WHERE`contents`.`component\u id`INSELECT id FROM components WHERE ...


如果您有很多ID,这对性能会更好。如果您使用pulk或@food.components.ids of@food.component\u id,您可以获得一个庞大的id数组,并将其传递给您的查询,这可能会变得非常缓慢。

您也可以使用如下子查询执行此操作:

@pairs=食物。连接:contents.wherecontents:{component\u id: @食品.化合物.选择:id} 然后您会得到一个类似以下内容的查询:

从“内容”上的“食品”内部连接“内容”中选择“食品”。“食品id”= `食品`.`id`WHERE`contents`.`component\u id`INSELECT id FROM components WHERE ...


如果您有很多ID,这对性能会更好。如果你使用Pulk或@food.components.ids of@food.component\u id,你可以得到一个庞大的ID数组,并将其传递给你的查询,这可能会变得非常缓慢。

这很有效,但现在我遇到了两个问题。1.查询结果需要一分钟左右的时间,我可能不得不改变我的方法,因为它在目录表上的记录数为150万条。2.有没有办法只归还一种食物,食物可以共享一种以上的化合物,因此它可以多次归还同一种食物1。您的表上有索引吗?2.您可以添加一个组:field_1,:field_2。。对于您的查询,这可能有助于缩小结果集。如果需要的话,你也可以在子查询中这样做,这样可以更容易地检索你可能需要的字段。谢谢你的回答,让我朝着正确的方向前进。这很好,但现在我遇到了两个问题。1.查询结果需要一分钟左右的时间,我可能不得不改变我的方法,因为它在目录表上的记录数为150万条。2.有没有办法只归还一种食物,食物可以共享一种以上的化合物,因此它可以多次归还同一种食物1。您的表上有索引吗?2.您可以添加一个组:field_1,:field_2。。对于您的查询,这可能有助于缩小结果集。如果需要,您也可以在子查询中执行此操作,这样可以更轻松地检索您可能需要的字段。感谢您的回答,让我朝着正确的方向前进。此操作对我有效,使用@Smek answer,因为它返回结果的速度更快。但是谢谢你的回答,帮助我意识到我没有抓住复合物的东西。这对我很有效,与@Smek answer一起使用,因为它返回结果更快。但是谢谢你的回答,帮助我意识到我没有抓住复合物的东西
@pairs = Food.joins(:contents).where(contents: { compound_id: compound_ids })