2011-12-19 62 views
2

我在我的应用程序中有团体(Group模型),代表人群。 我希望每个组都有自己的论坛。Forem宝石:如何将论坛链接到其他模型

我应该只是在groups表中的论坛ID?它感觉不对。如果我自己做了,论坛将会与一个“可成形”元素(在这种情况下的团体,但我有其他需要论坛的模型)具有多态关联。

对我应该怎么做的任何意见?修改gem以适应我的需求,或者只需要我的模型中的forum_id需要论坛?或者其他解决方案可能?

回答

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 

同样的事情,只不过这次我们发现,链接到的所有组通过我们之前设立的这个协会的特定论坛。这将在forum_groups表上执行INNER JOIN,然后在forem_forums表上执行另一个,获取所需的数据。

我希望这可以帮助你,并感谢使用Forem!

+1

感谢您的全面解答!我的小组更像是聚会小组,而不是一般论坛用来管理权限的小组。所以基本上,我需要在团体和论坛之间建立一对一的关系。一个小组将有一个论坛,以便他们可以聊什么。所以我想我应该选择第一个解决方案。但是,拥有一个“belongs_to”论坛似乎很奇怪。 – Robin 2011-12-19 22:42:24

相关问题