Forem gem:如何将论坛链接到其他模型

时间:2011-12-19 21:44:44

标签: ruby-on-rails ruby-on-rails-3 model gem

我的应用中有组(Group型号),代表人群。 我希望每个小组都有自己的论坛。

我应该在groups表格中拥有论坛ID吗?感觉不对劲。如果我自己做了,那么论坛就会有一个与“forumable”元素的多态关系(在这种情况下是组,但我还有其他需要论坛的模型)。

关于我应该做什么的任何意见?修改gem以满足我的需求,或者只需要在需要论坛的模型中使用forum_id?或者另一种解决方案呢?

1 个答案:

答案 0 :(得分:3)

我是那个创办Forem的人(虽然做了大部分艰苦工作的志愿者!),我想我可以回答这个问题。

如果您只想让某些群组访问一个且只有一个论坛,那么您可以将forum_id字段放在groups表上并按此方式执行。您可以执行的操作是覆盖can_read_forem_forum?模型中的User方法,以对该用户执行权限检查:

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

这在Forem's ability model中用于确定某人是否可以访问论坛。这个方法将要做的是它只返回具有特定论坛链接的用户的组。如果有,那么就知道用户可以访问该论坛。

现在,如果你要去一个群组可以访问许多论坛的其他路线,那么你就可以在groupsforem_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!