Сложные отношения has_many и Rails - PullRequest
0 голосов
/ 01 апреля 2011

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

Мне нужно, чтобы пользователи могли быть администраторами, редакторами или любыми (и многими) учетными записями.

На данный момент у меня есть это:

account.rb

has_many :memberships, :dependent => :destroy
  has_many :administrators, :through => :memberships, :source => :user, :conditions => {'memberships.is_admin' => true} 
  has_many :editors, :through => :memberships, :source => :user, :conditions => {'memberships.is_editor' => true} 

user.rb

has_many :memberships
  has_many :accounts, :through => :memberships
  has_many :editor_accounts, :through => :memberships, :source => :account, :conditions => {'memberships.is_editor' => true}
  has_many :administrator_accounts, :through => :memberships, :source => :account, :conditions => {'memberships.is_admin' => true}

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

@account.administrators << current_user
current_user.adminstrator_accounts = [..]

и т.д.

1 Ответ

1 голос
/ 01 апреля 2011

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

has_many :memberships,
  :dependent => :destroy
has_many :administrators,
  :through => :memberships,
  :source => :user,
  :conditions => { :is_admin => true }

Условия должны применяться тогда и только тогда, когда ключи условийсопоставьте имена столбцов в ассоциации.Пока таблица users не имеет столбца is_admin, это будет хорошо.

Как примечание, наличие нескольких логических флагов для чего-то подобного может быть неудобным.Можно ли быть администратором и редактором?Возможно, вам лучше использовать простой столбец роли, а затем использовать его:

has_many :administrators,
  :through => :memberships,
  :source => :user,
  :conditions => { :role => 'admin' }

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

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