我是创建 Forem 的人(不过,是志愿者做了大部分的努力!),我想我可以回答这个问题。
如果您只希望某些组可以访问一个且只有一个论坛,那么您可以将forum_id 字段放在groups 表上并这样做。然后,您可以做的是覆盖 User 模型中的 can_read_forem_forum? 方法以对该用户执行权限检查:
def can_read_forem_forum?(forum)
groups.where(:forum_id => forum.id).any?
end
这在Forem's ability model 中用于确定一个人是否可以访问论坛。此方法要做的是,它只会为该用户返回具有该特定论坛链接的组。如果有,那么就知道该用户可以访问该论坛。
现在,如果您要走另一条路线,一个群组可能可以访问许多论坛,那么您可以在 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
同样的事情,除了这次我们通过我们之前建立的关联找到所有链接到特定论坛的群组。这将在forum_groups 表上执行INNER JOIN,然后在forem_forums 表上执行另一个,获取所需的数据。
希望对您有所帮助,感谢您使用 Forem!