开发者

Making record available only to certain models in Rails 3

I have a weird design question. I have a model called Article, which has a bunch of attributes. I also have an article search which does something like this:

Article.project_active.pending.search(params)

where search builds a query based on certain params. I'd like to be able to limit results based on a user, that is, to have some开发者_Python百科 articles have only a subset of users which can see them. For instance, I have an article A that I assign to writers 1,2,3,4. I want them to be able to see A, but if User 5 searches, I don't want that user to see. Also, I'd like to be able to assign some articles to ALL users.

Not sure if that was clear, but I'm looking for the best way to do this. Should I just store a serialized array with a list of user_id's and have -1 in there if it's available to All?

Thanks!


I would create a join table between Users and Articles called view_permissions to indicate that a user has permission to view a specific article.

class ViewPermission
  belongs_to :article
  belongs_to :user
end

class User
  has_many :view_permissions
end

class Article
  has_many :view_permissions
end

For example, if you wanted User 1 to be able to view Article 3 you would do the following:

ViewPermission.create(:user_id => 1, :article_id => 3)

You could then scope your articles based on the view permissions and a user:

class Article
  scope :viewable_by, lambda{ |user| joins(:view_permissions).where('view_permissions.user_id = ?', user.id) }
end

To search for articles viewable by a specific user, say with id 1, you could do this:

Article.viewable_by(User.find(1)).project_active.pending.search(params)

Finally, if you want to assign an article to all users, you should add an viewable_by_all boolean attribute to articles table that when set to true allows an article to be viewable by all users. Then modify your scope to take that into account:

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


If an Article can be assigned to multiple Writers and a Writer can be assigned to multiple Articles, I would create an Assignment model:

class Assignment < AR::Base
  belongs_to :writer
  belongs_to :article
end

Then you can use 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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜