Вход нескольких типов пользователей - PullRequest
2 голосов
/ 04 мая 2011

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

У меня есть сайт, на котором есть 2 разных типа пользователей с разными и общими атрибутами (покупатели и магазины). Оба должны иметь возможность войти в систему, но будут иметь разные функциональные возможности и опции панели навигации по всему сайту. Они также поделятся некоторыми функциями. Например, оба должны иметь возможность поиска данных в магазинах. Однако только магазины смогут обновлять данные в них.

Первоначально я создал пользовательский класс с электронной почтой, encrypted_password, salt и т. Д. Я хотел использовать код регистрации / входа в систему. Но каждый тип пользователя будет дополнительно иметь функциональность.

Я думал, что у меня будет следующая база данных:

create_table :users do |t|
      t.string :email
      t.string :encrypted_password
      t.string :salt
      t.timestamps
end

create_table :shoppers do |t|
  t.integer  :dollars 
  t.string   :promo_info
end  

create_table :stores do |t|
  t.string   :address
  t.string   :city
  t.string   :zipcode
  t.string   :category_id
end

Тогда у меня был бы класс Shopper & Store, который наследовал бы от класса User, получая все функции входа / регистрации, определенные там. Или было бы более разумно просто иметь в каждом Магазине и Покупателе пользователя и делегировать ему любые вызовы аутентификации shopper.user.login ()

Правильно ли я думаю об этом?

Ответы [ 2 ]

0 голосов
/ 04 мая 2011

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

class User < ActiveRecord::Base; end
class Store < User; end
class Shopper < User; end

Реализация пользовательских методов и проверок в логике User и Store / Shopper в соответствующем подклассе.

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

resources :products, :only => [:index, :show]

namespace :shoppers do
  resources :products
end

Запустите rake routes, и вы увидите, что из этого получится.

0 голосов
/ 04 мая 2011

Да, вы думаете об этом правильно imho.

Это действительно вопрос OOD: вы спрашиваете, использовать ли композицию (класс Store имеет пользователя) или наследование (класс Store является пользователем ). Композиция считается лучшим выбором дизайна. Я предлагаю вам Google состав против наследования для получения дополнительной информации.

В вашем случае я считаю, что композиция имеет больше смысла. Функциональность аутентификации, реализованная в классе User, не имеет прямого отношения к функциональности, реализованной в Store или Shopper. Кроме того, в магазине может быть логически более одного пользователя: несколько сотрудников магазина, возможно, с разными уровнями авторизации, имеют доступ к вашей системе.

...