簡體   English   中英

帶有多個記錄的Rails復雜查詢設置

[英]Rails complex query setup with multiple records

我試圖弄清楚如何在rails中執行查詢,其中從另一個查詢返回了多個id。 我有一個包含通過內容包含許多化合物的食物表。 我想做的是獲取與原始食物至少共享一種化合物的食物清單。 目前,我有以下內容:

要從最初的食物中獲取化合物,我需要這樣做:

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

這樣就設置了食物和化合物,我可以通過調用每個內容來輸出所有內容並顯示每種食物中的化合物。 因此,下一步我不確定該怎么做是如何從內容表中獲取所有food_id,其中compound_id等於上述返回的原始內容中的其中一個(希望這是有道理的)。 所以像這樣(我知道這是不對的)

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

任何幫助將不勝感激,嘗試谷歌搜索答案,但甚至不能確定谷歌如何找到正確的方向

您已經渴望在獲取@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)

這是最簡單的方法,無需進入子查詢等。

您也可以使用以下子查詢來執行此操作:

@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,這可能會更好地提高性能。 如果您使用@ food.compound_ids的pluck或@ food.compounds.ids,則可以獲得大量ID,並將其傳遞到查詢中,這會變得非常慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM