У меня есть приложение Rails, где пользователи имеют членство в проектах (и другие вещи, полиморфно). Пользователи также имеют роли. Я хочу, чтобы проекты User # работали как обычная находка ActiveRecord, но я также хочу, чтобы администраторы имели доступ к каждому проекту.
Некоторое время я занимался этим:
class User < ActiveRecord::Base
has_many :memberships, :dependent => :destroy
def projects
if has_role?(:admin)
Project.find(:all)
else
Project.find(:all, :include => :memberships, :conditions => ["memberships.user_id = ?", id])
end
end
end
class Project < ActiveRecord::Base
has_many :memberships, :as => :member, :dependent => :destroy
end
class Membership < ActiveRecord::Base
belongs_to :user
belongs_to :member, :polymorphic => :true
end
Но я бы предпочел сделать что-то вроде этого:
class User < ActiveRecord::Base
has_many :memberships, :dependent => :destroy
has_many :projects, :through => :memberships, :source => :member, :source_type => "Project"
end
чтобы я мог использовать named_scope более регулярно (например, 'alfred.projects.recent.active').
Это работает, если вы автоматически добавляете новые членства для администраторов, но быстро выходит из-под контроля.
Я хочу сохранить интерфейс проектов User #. Какой правильный путь здесь?
Большое спасибо.