2015-12-02 44 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

    相关问题