Forem Gem: как связать форум с другими моделями - PullRequest
2 голосов
/ 20 декабря 2011

В моем приложении есть группы (Group модель), которые представляют группы людей.Я хочу, чтобы у каждой группы был свой собственный форум.

Должен ли я просто иметь идентификатор форума в таблице groups?Это не правильно.Если бы я сделал это сам, форум имел бы полиморфную ассоциацию с «поддающимся формуле» элементом (группы в данном случае, но у меня есть другие модели, которым нужен форум).

Любые мнения о том, что я должен делать?Изменить драгоценный камень, чтобы он соответствовал моим потребностям, или просто укажите forum_id в моих моделях, которым нужен форум?Или, может быть, другое решение?

1 Ответ

3 голосов
/ 20 декабря 2011

Я парень, который основал Forem (хотя волонтеры сделали большую часть тяжелой работы!), Я думаю, что могу ответить на этот вопрос.

Если вы хотите, чтобы только определенные группы имели доступ к одному и только одному форуму, вы можете поместить поле forum_id в таблицу groups и сделать это таким образом. Затем вы можете переопределить метод can_read_forem_forum? в вашей модели User, чтобы выполнить проверку прав доступа для этого пользователя:

def can_read_forem_forum?(forum)
  groups.where(:forum_id => forum.id).any?
end

Используется в модели способностей Forem , чтобы определить, может ли человек получить доступ к форуму. Что этот метод собирается сделать, так это то, что он будет возвращать только группы для этого пользователя, которые имеют ссылку на этот конкретный форум. Если они есть, то известно, что пользователь может получить доступ к этому форуму.

Теперь, если вы идете другим путем, где группа может иметь доступ ко многим форумам, тогда вы должны определить таблицу соединений между groups и forem_forums (называемой forum_groups) и определить ее как ассоциация в вашей Group модели, например:

has_many :forum_groups
has_many :forums, :through => :forum_groups, :class_name => "Forem::Forum"

Вам также необходимо определить новую модель внутри вашего приложения для этой forum_groups ассоциации, она будет называться ForumGroup и будет выглядеть примерно так:

class ForumGroup < ActiveRecord::Base
  belongs_to :forum, :class_name => "Forem::Forum"
  belongs_to :group
end

Мы делаем это таким образом, чтобы у вас был простой способ управлять связями между форумами и группами. Если вы сделали has_and_belongs_to_many, это обычно приводит к гигантской боли в заднице, когда вы хотите удалить одну конкретную запись из этой соединительной таблицы.

Теперь, когда все хорошо настроено, метод, который вы хотите определить в своей User модели, будет таким:

def can_read_forem_forum?(forum)
  groups.joins(:forums).where("forem_forums.id = ?", forum.id).any?
end

То же самое, за исключением того, что на этот раз мы находим все группы, которые связаны с конкретным форумом через ту ассоциацию, которую мы создали ранее. Это сделает INNER JOIN для таблицы forum_groups, а затем еще одну для таблицы forem_forums, получив необходимые данные.

Надеюсь, это поможет вам, и спасибо за использование Forem!

...