2013-03-28 3 views
0

Это может быть трудным для меня объяснить, поэтому, если неясно, просто дайте мне знать, чтобы я мог редактировать по мере необходимости!Как собрать все темы, принадлежащие членам групп, в которых я состою?

У меня есть следующий пример:

class User < ActiveRecord::Base 
    has_many :topics 
    has_many :memberships 
end 

class Topic < ActiveRecord::Base 
    belongs_to :user 
end 

#join model between User and Group 
class Membership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :group 
end 

class Group < ActiveRecord::Base 
    has_many :memberships 
    has_many :members, :through => :memberships, :source => :user 
    has_many :topics, :through => :members 
end 

Проблема у меня в том, что я пытаюсь создать канал (@feed_topics) по всем темам, которые принадлежат всем членам группы Я: член, и я заводил себе немного орехов.

Должен ли я попытаться сделать это с помощью ассоциаций или создать метод экземпляра в моей модели User, который имеет некоторый ActiveRecord/SQL для объединения всех тем членов группы в один объект ActiveRecord :: Relation?

Моя цель - написать current_user.feed_topics в действии моего контроллера.

+0

Привет, вы можете уточнить, что должен представлять представитель GroupUser? И что это значит, что у Пользователя есть много GroupUsers? – Rebitzele

+0

Привет @Rebitzele, я отредактировал мой вопрос, чтобы уточнить. Пока я здесь - GroupUser - это, в основном, объект членства, объединяющий различных пользователей с различными группами. Вы, вероятно, можете ответить на свой второй вопрос самостоятельно :) Надеюсь, что это поможет. Спасибо за ваш интерес. – RudyOnRails

ответ

1

Извините, что не объяснял ранее! Идея заключалась в том, чтобы использовать «Nested has_many_through», чтобы перейти к вашим темам фида. Эта концепция приведена здесь под заголовком «Вложенные ассоциации»: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html. Сообщите мне, если это все еще неясно (или если оно не работает).

class User < ActiveRecord::Base 
    has_many :topics 
    has_many :memberships 
    has_many :groups, :through => :membership 
    has_many :group_members, :through => :groups, :source => :member 
    has_many :feed_topics, :through => :group_members, :source => :topic 
end 
+0

Я не понимаю, что вы пытаетесь сделать там. Думаю, мне нужно больше объяснений. Я собираюсь настроить модель GroupUsers, и теперь просто назовите ее «Членство», чтобы сделать это более простым. Надеюсь, никто в настоящее время не работает над ответом! – RudyOnRails

+0

Я вижу, где я был немного смущен. Мне было интересно, почему у вас было 'has_many: group_members,: through =>: groups,: source =>: member' в модели User, но я не обвиняю вас! Возможно, он мог работать в обоих направлениях. Для понимания я поместил его в модель группы b/c. Мне казалось, что имеет смысл делать '@ group.members'. – RudyOnRails

1

До сих пор эти окончательные варианты моделей от первоначального вопроса (тема и членство не изменится):

class User < ActiveRecord::Base 
    has_many :topics 
    has_many :memberships 
    has_many :groups, :through => :memberships 
    has_many :feed_topics, :through => :groups, :source => :member_topics 
end 

class Group < ActiveRecord::Base 
    has_many :memberships 
    has_many :members, :through => :memberships, :source => :user 
    has_many :member_topics, :through => :members, :source => :topics 
end 

Я тестирование прямо сейчас, добавив несколько групп и членов, чтобы увидеть если он затрагивает темы других участников других групп.

EDIT: кажется, что все работает нормально.

EDIT2: одна небольшая проблема, с которой я столкнулся, повторял повторяющиеся темы, потому что член был в нескольких группах. Я узнал о :uniq => true, и он спас день.

+1

Это отлично выглядит - спасибо за ваше обновление. – Rebitzele