2012-04-23 3 views
1

Я новичок в рельсах, и я хотел бы знать, как я должен делать что-то вроде этого:Рельсы способ создать сложную структуру пользователя

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

Как я должен осуществить это, имея в виду те similarites и различия:

Отличия:

  • С деловой точки зрения, эти две группы являются отдельными, в общих клиенты покупают у поставщиков.
  • Они связаны главным образом с различными моделями, поставщиками 90% времени используют бэкэнд приложения и только для клиентов. manamegent счет
  • Пользователь довольно сильно отличается

Сходства:

  • Для обоих я хотел бы использовать некоторые роли на основе решения авторизации
  • Они оба журнала в
  • (бывший declarative authorization.) Существуют редкие ситуации, когда оба взаимодействуют с одними и теми же моделями через одни и те же контроллеры/виды

Какое оптимальное решение для простой и простой в одно и то же время? Одна толстая модель пользователя связана с моделями клиентов и поставщиков? Отдельные модели с дублированной логической логикой (как это работает с декларативной авторизацией)? Однонаправленное наследование (опять же, что касается декларативного разрешения)?

+0

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

ответ

2

Я бы создал класс User, который обрабатывает такие вещи, как авторизация и любые другие базовые функции, которыми обладают все пользователи вашей системы. Затем создайте отдельные классы Customer и Vendor, которые наследуют от User и имеют свою собственную бизнес-логику. STI в Rails делает это очень просто - создайте столбец type, и он автоматически заполнится именем класса.

Вы можете использовать драгоценный камень, например CanCan, для разделения разрешений для каждого типа User.

+0

Согласен. Добавьте класс Role и много-много между User и Role. Я называю это RoleMembership. Я выполняю авторизацию в файле before_filter в ApplicationController. У меня также есть таблица, с которой роли могут получить доступ к контроллерам. –

+0

Спасибо, я пойду так, надеюсь, что STI не будет решать проблемы с использованием драгоценных камней, таких как CanCan или декларативная авторизация – fobb

1

ОК, я делал перерыв StackOverflow на работе, а затем работа вызывала меня, поэтому я быстро ответил. Вы должны решить, если вы хотите использовать STI,

class CreateUsers < ActiveRecord::Migration 
    def change 
    create_table :users do |table| 
     table.string "type" 
... 

и хранить Vendor и объектов клиента экземпляры в таблице пользователей, или использовать многоуровневые таблицы наследования, где вы просто просто иметь

class Vendor < ActiveRecord::Base 
    belongs_to :user 
... 
class Customer < ActiveRecord::Base 
    belongs_to :user 
... 

Вам понадобится MTI, если у вас когда-либо были данные состояния, специфичные для вашего объекта Vendor and/or Customer, такие как продажа или продажа купли-продажи клиента. Хорошо, история покупок, вероятно, будет соединена с другими таблицами, которые принадлежат к: клиенту, но может показаться неудобным иметь присоединенные записи, принадлежащие пользователю: когда Пользователь может быть Поставщиком.

Теперь, для привязки к контролю доступа, ...Я реализовал access_control_items таблицу,

class CreateAccessControlItems < ActiveRecord::Migration 
    def change 
    create_table "access_control_items", :force => true do |table| 
     table.timestamps 
     table.string "controller" 
     table.string "action" 
     table.string "group_type", :null => false 
     table.integer "group_id", :null => false 
    end 
    end 
end 

Главное, что я развязаны членство в роли от системы контроля доступа, и сделал это полиморфный, так что это может быть членство в какой-либо объект с включаемой? (Пользователь) метод. Мой диспетчер приложений до того, как метод отправит пользователя, который в настоящее время вошел в систему, к include? метод группы, на который ссылается любой элемент access_control_items, соответствующий контроллеру и действию.

Таким образом, группа может указывать на экземпляр некоторого класса ActiveRecord, этот класс может быть тем, который отвечает true, чтобы включить? (Пользователь), если пользователь является поставщиком (имеет тип = «поставщик» в STI или has_one : поставщик не ноль в MTI).

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

Смежные вопросы