2015-12-02 63 views
1

我有這種情況:Rails的 - 什麼是建立查詢多個標籤的最有效的方式

兩種型號: - 膳食 - 標籤

隨着many-to-many關係,所以產品可以分配很多標籤。

沒有爲關聯附加表(meal_idtag_id) 然後用戶選擇一些標籤(例如8)。

我必須寫在滑軌查詢(但也可以是僅SQL想法),其返回:已分配的至少一個標籤,從由用戶選擇的

  1. 膳食。
  2. 飯菜已分配的所有選擇標籤。

我不知道如何做到這一點的最有效的方式。你能幫我一下嗎?

Meal.rb

class Meal < ActiveRecord::Base 
    has_and_belongs_to_many :tags 
end 

Tag.rb

class Tag < ActiveRecord::Base 
    has_and_belongs_to_many :meals 
end 
+0

你說的附加表(meal_id,tag_id)是另一個模型(我認爲),它的名字是什麼?順便說一下,爲什麼你需要另一個關聯表,如果你可以在你的產品表中添加一個'tag_id'的列,並且在你的標籤表中添加'meal_id'以符合關係 –

+0

不,這不是另一個表。這只是聯想。我無法將tag_id添加到餐桌和meal_id來標記餐桌,因爲餐可以分配多個標記。 – user2948135

+0

@ user2948135您應該在您的模型產品和標籤中顯示代碼,以便我們看到您的關聯是如何設置的。但是你上面的評論是錯誤的,實際上你可以做你說的不可以的,它被稱爲has_many協會。請參閱文檔:http://guides.rubyonrails.org/association_basics。html#這個有很多聯繫 –

回答

1

讓我們嘗試讓Meal動態tag_ids。你一定要收集tag_ids那麼你通過tag_ids

tag_ids = [1, 2, 3, 4] 
Meal.joins(:tags).where('tags.id IN (?)', tags_ids).group("meals.id") 
        .having("COUNT(meals.id) >= ?", tag_ids.length) 

我希望這可以幫助您加入Meal

+0

這是非常好的答案,謝謝。 – user2948135

+0

不客氣。很高興幫助你。 – akbarbin

0

要返回查詢你想嘗試以下方法:已分配的至少一個標籤

  1. 「餐「
# we will store meal objects in this array 
    #the ones that has at least one tag 
    meals = [] 

    # go over all meals 
    Meal.all.each do |meal| 

     # if meal has tags store it 
     if !meal.tags.blank? 
     meals << meal 
     end 

    end 

    # then I have all meals with at least one tag in my array called meals 
    # and I can do whatever I want with it 
    meals.each do |m| 
     #do something with each meal 
    end 

    how_many_meals_with_one_tag_at_least = meals.count 
  • 「已分配的所有選擇標籤膳食」。我認爲你的意思是:「分配了所有現有標籤的餐食」。
  • # again our array to store meals 
        meals = [] 
    
        maximumTags = Tag.all.count 
    
        Meal.all.each do |meal| 
    
         if meal.tags.count == maximumTags 
         meals << meal 
         end 
    
        end 
    
        meals.each do |m| 
         #do something with your meal with all tags assigned 
        end 
    

    我知道這方法比SQL更紅寶石,但它很容易實現,並讓你在那裏。

    +0

    感謝您的迴應,但我的意思是我寫的。在第一種情況下應該是「至少有一個來自選擇的標籤」。所以它與我認爲安靜的硬sql查詢有關。 – user2948135

    相關問題