Можно ли таким способом смоделировать трехсторонние отношения в Rails? - PullRequest
1 голос
/ 24 октября 2010

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

Class User < AR::Base
    has_and_belongs_to_many :roles, :join_table => "user_brand_roles"
    has_and_belongs_to_many :brands, :join_table => "user_brand_roles"
end

Проблема с этой настройкой состоит в том, как проверить марку и роль одновременно?

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

Пользователь класса : user_brand_roles end

Класс BrandRole

Таким образом, я мог бы найти для бренда марку для пользователя:

br = current_user.brand_roles.where(:brand_id => @brand.id).includes(:brand_role)
if br.blank? or br.role != ADMIN
  # reject access, redirect
end

Это новое приложение, и я пытаюсь извлечь уроки из прошлых ошибок и придерживатьсяRails Way.Я делаю какие-то плохие предположения или проектные решения здесь?

Ответы [ 2 ]

1 голос
/ 24 октября 2010

Предполагая роли, бренды являются справочными таблицами. Вы можете иметь одну таблицу ассоциации Обязанности со столбцами user_id, role_id, brand_id . Тогда вы можете определить

Class User < AR::Base
 has_many : responsibilities
 has_many :roles, :through => responsibilities
 has_many :brands,:through => responsibilities
end
Class Responsibility < AR::Base
 belongs_to :user
 has_one :role
 has_one :brand
end

Вы можете определить

Class User < AR::Base
  def has_access?(brand)
     responsibility = responsibilities.where(:brand => brand)
     responsibility and responsibility.role == ADMIN
  end
end

[Не уверен, является ли термин «Ответственность» термином, используемым в вашем домене, но используйте термин домена вместо вызова его как user_brand_role]

0 голосов
/ 24 октября 2010

Это концептуальная вещь.Если BrandRole является сущностью для вашего приложения, тогда ваш подход должен работать.Если BrandRole сама по себе не является сущностью в вашем приложении, возможно, вы можете создать модель UserBrandRole:

class User < AR::Base
  has_many :user_brand_roles
end

class Brand < AR::Base
  has_many :user_brand_roles
end

class Role < AR::Base
  has_many :user_brand_roles
end

class UserBrandRole < AR::Base
  belongs_to :user
  belongs_to :brand
  belongs_to :role
  validates_uniqueness_of :role_id, :scope => [:user_id, :brand_id]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...