RoR 3 - Поиск списка родителей из группы детей

У меня есть две модели с типичными отношениями:

модель menu_options:

class MenuOption < ActiveRecord::Base
  belongs_to :category
end

модель категорий:

class Category < ActiveRecord::Base
  has_many :menu_options
end

Я показываю категории в партиале, а затем 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)

person Nic    schedule 28.06.2011    source источник
comment
Re: ваше окончательное решение - я не думаю, что вам нужно использовать .uniq для этого. Не могли бы вы проверить это один раз?   -  person Dogbert    schedule 29.06.2011
comment
@Dogbert, да, он возвращал категории столько раз, сколько в них было MenuOptions. Сначала я не заметил, так как оставил строку @categories = categories.uniq.   -  person Nic    schedule 29.06.2011


Ответы (2)


Вы можете просто выбрать категории, которые имеют параметр меню с :user_level = user_level, используя

@categories = Categories.joins(:menu_options).where(:menu_options => { :user_level => user_level })
person Dogbert    schedule 28.06.2011
comment
Хаха, слово в слово точное решение - person Kyle d'Oliveira; 28.06.2011
comment
@Olives, хех, да :) Я думаю, что это будет :menu_options, а не :menu_option, как вы написали? - person Dogbert; 28.06.2011

Вместо этого вы можете сделать соединение, например:

@categories = Categories.joins(:menu_options).where(:menu_options => {:user_level => user_level})
person Kyle d'Oliveira    schedule 28.06.2011
comment
Очевидно, у меня недостаточно очков репутации, чтобы проголосовать за полезный ответ. - person Nic; 29.06.2011