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