2013-10-10 3 views
1

У меня есть три модели:ActiveRecord выбрать через Mutiple HABTM

class User < ActiveRecord::Base 
    has_and_belongs_to_many :groups 
end 

class Group < ActiveRecord::Base 
    has_and_belongs_to_many :channels 
    has_and_belongs_to_many :users 
end 

class Channel < ActiveRecord::Base 
    has_and_belongs_to_many :groups 
end 

Какой самый эффективный способ, чтобы получить все каналы (без дубликатов) для конкретного пользователя?

Так эффективно:

SELECT DISTINCT name FROM users 
    JOIN groups_users ON users.id=groups_users.user_id 
    JOIN channels_groups ON groups_users.group_id=channels_groups.group_id 
    JOIN channels ON channels_groups.channel_id=channels.id; 

ответ

0

Это следует сделать это:

user = User.first 
channels = user.groups.flat_map(&:channels).uniq 
+1

Я люблю рубин. Спасибо за это и &: shortcut. – Dave

+0

Добро пожаловать @Dave :-) Вы должны принять ответ, если он решает вашу проблему;) – MrYoshiji

+1

Просто примечание, uniq! возвращает nil, если никаких изменений не было сделано. Однако uniq отлично работает в этом случае. – Dave

Смежные вопросы