我有一个奇怪的设计问题。我有一个名为Article的模型,它有一堆属性。我也有一篇文章搜索,其中包含以下内容:
Article.project_active.pending.search(params)
其中search基于某些参数构建查询。我希望能够根据用户限制结果,也就是说,某些文章只有一部分用户可以看到它们。 例如,我有一篇文章A,我分配给作家1,2,3,4。我希望他们能够看到A,但如果用户5搜索,我不希望该用户看到。此外,我希望能够为所有用户分配一些文章。
不确定这是否清楚,但我正在寻找最佳方法。我应该只存储一个带有user_id列表的序列化数组,并且如果它可供所有人使用,那么它是否为-1?
谢谢!
答案 0 :(得分:2)
如果可以将文章分配给多个作者并且可以将Writer分配给多个文章,我会创建一个作业模型:
class Assignment < AR::Base
belongs_to :writer
belongs_to :article
end
然后你可以使用has_many:through:
class Article < AR::Base
has_many :assignments
has_many :writers, :through => :assignments
end
class Writer < AR::Base
has_many :assignments
has_many :articles, :through => :assignments
end
答案 1 :(得分:2)
我会在用户和文章之间创建一个名为view_permissions的连接表,以指示用户有权查看特定文章。
class ViewPermission
belongs_to :article
belongs_to :user
end
class User
has_many :view_permissions
end
class Article
has_many :view_permissions
end
例如,如果您希望用户1能够查看第3条,您将执行以下操作:
ViewPermission.create(:user_id => 1, :article_id => 3)
然后,您可以根据查看权限和用户对文章进行调整范围:
class Article
scope :viewable_by, lambda{ |user| joins(:view_permissions).where('view_permissions.user_id = ?', user.id) }
end
要搜索特定用户可查看的文章,例如ID为1,您可以执行以下操作:
Article.viewable_by(User.find(1)).project_active.pending.search(params)
最后,如果要为所有用户分配文章,则应该向articles表添加一个viewable_by_all布尔属性,当设置为true时,允许所有用户查看文章。然后修改范围以将其考虑在内:
class Article
scope :viewable_by, lambda{ |user|
joins('LEFT JOIN view_permissions on view_permissions.article_id = articles.id')
.where('articles.viewable_by_all = true OR view_permissions.user_id = ?', user.id)
.group('articles.id')
}
end