Несколько пользовательских ролей в Ruby on Rails - PullRequest
8 голосов
/ 29 декабря 2010

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

class Manufacturer < ActiveRecord::Base
 has_many :products
 has_many :transporters, :through => :products
end

class Product < ActiveRecord::Base
 belongs_to :manufacturer
 belongs_to :transporter
end

class Transporter < ActiveRecord::Base
 has_many :products
 has_many :manufacturers, :through => :products
end

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

Если возможно, я хотел бы иметь один экран входа в систему, а не 4 разных экрана.

Я не спрашиваю точный код, чтобы построить это, но у меня проблемы с определением наилучшего способа сделать это.Любые идеи будут с благодарностью - спасибо!

Ответы [ 3 ]

5 голосов
/ 29 декабря 2010

Ваш основной подход кажется разумным.Я бы посоветовал вам создать базовый класс User и использовать STI для определенных типов пользователей, например:

class User < ActiveRecord::Base
end

class Manufacturer < User
 has_many :products
 has_many :transporters, :through => :products
end

... и т. Д.Таким образом, если когда-либо возникает необходимость объединить несколько типов пользователей в одно отношение независимо от типа, у вас есть одна таблица для описания пользователей в целом.Это довольно распространенный подход.

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

4 голосов
/ 29 декабря 2010

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

1 голос
/ 29 декабря 2010

Я предлагаю вам создать модель пользователя, модель адреса, модель ContactInfo и т. Д. У вас не должно быть таких полей в модели пользователя. Нормализуйте базу данных. Иметь FK в каждом из этих классов для User.id.

Если вы ДОЛЖНЫ хранить их отдельно, тогда нормализуйте логины и сделайте их полиморфными для ссылки на их владельца (производителя, сотрудника и т. Д.)

...