使记录仅适用于Rails 3中的某些模型

时间:2011-03-08 21:21:07

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

我有一个奇怪的设计问题。我有一个名为Article的模型,它有一堆属性。我也有一篇文章搜索,其中包含以下内容:

Article.project_active.pending.search(params)

其中search基于某些参数构建查询。我希望能够根据用户限制结果,也就是说,某些文章只有一部分用户可以看到它们。 例如,我有一篇文章A,我分配给作家1,2,3,4。我希望他们能够看到A,但如果用户5搜索,我不希望该用户看到。此外,我希望能够为所有用户分配一些文章。

不确定这是否清楚,但我正在寻找最佳方法。我应该只存储一个带有user_id列表的序列化数组,并且如果它可供所有人使用,那么它是否为-1?

谢谢!

2 个答案:

答案 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