2011-06-28 80 views
4

我有两个型号,一个典型的关系组寻找父母的列表:回报率3 - 从儿童

menu_options型号:

class MenuOption < ActiveRecord::Base 
    belongs_to :category 
end 

类模型:

class Category < ActiveRecord::Base 
    has_many :menu_options 
end 

我m在部分中显示类别,然后在另一个部分中显示menu_options。我目前通过的menu_options迭代,并收集所有,显示了这个代码的类别跳过空类别:

@menu_options = MenuOption.select_by_user_level(user_level) 
categories = [] 
@menu_options.each do |m| 
categories << m.category 
end 
@categories = categories.uniq 

我一直在使用这样做了很长一段时间的类似的方式得到,我想,如果有更多的方式来做到这一点?

**求助: 我忽略提及方法'select_by_user_level'使用不等式。我把你提供的代码,并更新它来摆脱这种方法,并将.uniq合并到选择类别的行中。结果如下。谢谢你的帮助!

@categories = Category.joins(:menu_options).where('menu_options.minimum_user_level <= ?', @user.user_level).uniq 
@menu_options = MenuOption.where('minimum_user_level <= ?', @user.user_level) 
+0

回复:你的最终解决方案 - 我不认为你需要在这上面使用'.uniq'。你能测试一次吗? – Dogbert

+0

@Dogbert,我做过了,它返回的类别与其中的“MenuOption”一样多。我原本没有注意到,因为我已经离开了'@categories = categories.uniq'这一行。 – Nic

回答

5

可以具有一个menu_option与只需选择类别:user_level = user_level使用

@categories = Categories.joins(:menu_options).where(:menu_options => { :user_level => user_level }) 
+0

哈哈,一字一句的确切解决方案 – Olives

+0

@Oives,heh,yes :)我认为这将是':menu_options'而不是':menu_option',因为您已发布? – Dogbert

+0

你是对的。这只是一个错字。 – Olives

4

你可以做一个联接代替类似:

@categories = Categories.joins(:menu_options).where(:menu_options => {:user_level => user_level}) 
+0

我显然没有足够的“声誉”点来投票答案有用。 – Nic