2011-06-28 103 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