【问题标题】:Rails complex query setup with multiple recordsRails 具有多条记录的复杂查询设置
【发布时间】:2018-08-09 00:40:14
【问题描述】:

我试图弄清楚如何在从另一个查询返回多个 id 的 rails 中进行查询。我有一个 Food 表,它通过内容包含许多化合物。我试图做的是获取与原始食物共享至少一种化合物的食物列表。目前我有以下:

为了从最初的食物中获取化合物,我有这个:

def set_food
      @food = Food.includes(:compounds).find(params[:id])
    end

这设置了食物和化合物,我可以通过调用 each-do 来输出所有内容并显示每种食物中的化合物。所以下一步我不知道该怎么做是如何从内容表中获取所有的 food_id,其中 complex_id 等于上面返回的原始内容中的一个(希望这是有道理的)。所以像这样(我知道这是不对的)

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

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

【问题讨论】:

    标签: sql ruby-on-rails postgresql


    【解决方案1】:

    你也可以用这样的子查询来做到这一点:

    @pairs = Food.joins(:contents).where(contents: { compound_id: @food.compounds.select(:id) }) 然后你会得到一个类似的查询:

    SELECT `foods`.* FROM `foods` INNER JOIN `contents` ON `contents`.`food_id` = `foods`.`id` WHERE `contents`.`compound_id` IN(SELECT id FROM compounds WHERE ...)

    如果您有很多 id,这可能会更好地提高性能。如果您使用 pluck 或 @food.compounds.ids 或 @food.compound_ids ,您可以获得大量 id 并将其传递给您的查询,这可能会变得非常慢。

    【讨论】:

    • 这很好用,但现在我遇到了两个问题。 1. 结果需要一分钟左右的时间来查询,我可能不得不改变我的方法,导致它在目录表上通过 150 万条记录。 2. 有没有办法只返回一种食物,食物可以共享一种以上的化合物,所以它可以多次返回相同的食物
    • 1.你的表上有索引吗? 2. 您可以在查询中添加一个组(:field_1, :field_2, ..),这可能有助于使您的结果集更小。如果需要,您也可以在子查询中执行此操作,这样可以更轻松地检索您可能需要的字段。
    • 感谢您的回答,让我朝着正确的方向前进
    【解决方案2】:

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

    首先,获取与您的原始食物相关的所有有趣的复合 id:

    compound_ids = @food.compounds.pluck(:id)
    

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

    # worth the try
    compound_ids = @food.compound_ids
    

    第二步,您几乎使用了与之前相同的查询:

    @pairs = Food.joins(:contents).where(contents: { compound_id: compound_ids })
    

    { compound_id: [array] } 应该转换为 SQL IN 语句,例如:contents.compound_id IN (1,2,3)

    这是最直接的方法,无需涉及子查询等。

    【讨论】:

    • 这对我有用,与@Smek 回答一起使用,因为它更快地返回结果。但是谢谢你的回答,帮助我意识到我没有掌握 Compound_ids
    猜你喜欢
    • 2011-10-17
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多