Сделать запись доступной только для определенных моделей в Rails 3 - PullRequest
0 голосов
/ 09 марта 2011

У меня странный вопрос о дизайне.У меня есть модель под названием Article, которая имеет множество атрибутов.У меня также есть поиск статьи, который делает что-то вроде этого:

Article.project_active.pending.search(params)

, где поиск строит запрос на основе определенных параметров.Я хотел бы иметь возможность ограничить результаты в зависимости от пользователя, то есть, чтобы некоторые статьи имели только подмножество пользователей, которые могут их видеть.Например, у меня есть статья А, которую я назначаю авторам 1,2,3,4.Я хочу, чтобы они могли видеть A, но если пользователь 5 выполняет поиск, я не хочу, чтобы этот пользователь видел.Также я хотел бы иметь возможность назначать некоторые статьи ВСЕМ пользователям.

Не уверен, что это было ясно, но я ищу лучший способ сделать это.Стоит ли просто хранить сериализованный массив со списком user_id и иметь -1 там, если он доступен для всех?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 09 марта 2011

Я бы создал таблицу соединения между пользователями и статьями под названием 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

Для поиска статей, доступных для просмотра определенному пользователю, например, с идентификатором 1, вы можете сделать это:

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

Наконец, если вы хотите назначить статью всем пользователям, вы должны добавить логический атрибут 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
2 голосов
/ 09 марта 2011

Если статья может быть назначена нескольким авторам, а писатель может быть назначен нескольким статьям, я бы создал модель назначения:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...