Rails + простая ролевая система через ассоциативную таблицу - PullRequest
0 голосов
/ 11 апреля 2010

Итак, у меня есть модель Ninja, в которой есть много судов на воздушной подушке через ninja_hovercrafts (где хранятся ninja_id и hovercraft_id).

Насколько я понимаю, такой порядок должен быть задан таким образом, чтобы в ассоциативной таблице хранилось только достаточно информации для связывания двух разных классов.

Но я хотел бы использовать ассоциативную таблицу для работы в качестве очень упрощенного центра авторизации в моем приложении. Поэтому я также хотел бы, чтобы эта таблица информировала мою систему, если эта привязка делает ниндзя пилотом или вторым пилотом данного судна на воздушной подушке, через поле "роль" в таблице.

Мои вопросы:

  1. Это уродливо?

  2. Это нормально?

  3. Существуют ли методы, встроенные в рельсы, которые помогли бы мне автоматически создавать ассоциации ниндзя и судов на воздушной подушке с ролью? Например, могу ли я иметь вложенную форму для создания ниндзя и hcs таким образом, чтобы поле роли в ninjas_hovercrafts также было заполнено?

  4. Если управление ролями моих приложений таким способом не является хорошей идеей, какова не тяжелая альтернатива, не связанная с ресурсами (мое приложение разрабатывается с целью избежать проблем с масштабируемостью, таких как чрезмерные объединения, включения и т. Д.)

спасибо

1 Ответ

0 голосов
/ 12 апреля 2010

Это может не полностью ответить на ваш вопрос, но если у вас будет только две роли для судов на воздушной подушке, я бы вместо этого установил ассоциации, подобные этой

class Hovercraft < ActiveRecord::Base
  belongs_to :pilot, :class_name => 'Ninja', :foreign_key => 'pilot_id'
  belongs_to :copilot, :class_name => 'Ninja', :foreign_key => 'copilot_id'
end

class Ninja < ActiveRecord::Base
  has_many :pilotings, :class_name => 'Hovercraft', :foreign_key => 'pilot_id'
  has_many :copilotings, :class_name => 'Hovercraft', :foreign_key => 'copilot_id'
end

Теперь, если у вас больше ролей или если вам нужно больше гибкости, вы можете использовать третью модель, чтобы связать их вместе.

class Hovercraft < ActiveRecord::Base
  has_many :hovercraft_roles
  has_many :ninjas, :through => :hovercraft_roles
end

class HovercraftRole < ActiveRecord::Base
  belongs_to :hovercraft
  belongs_to :ninja
end

class Ninja < ActiveRecord::Base
  has_many :hovercraft_roles
  has_many :hovercrafts, :through => :hovercraft_roles
end

С атрибутом роли в HovercraftRole модели для указания, является ли он «пилотом» или «вторым пилотом».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...