Обработка разных типов пользователей в Rails - PullRequest
5 голосов
/ 18 октября 2011

Я разрабатываю приложение, у которого есть два [три, включая администраторов] типа пользователей: покупатели и продавцы. Когда пользователь регистрируется, предполагается, что он регистрируется, чтобы просто купить что-то [аккаунт покупателя]. Однако, если они хотят стать Продавцом, у них должна быть возможность выставить свои товары на продажу, [стать Продавцом]. Это становится важным, так как пользователи могут переключаться между типами учетных записей.

Конечно, Продавец также может покупать товары.

Проблема

Проблема, с которой я сталкиваюсь, заключается в том, что у Продавцов есть profile страницы, на которые покупатели могут перейти, чтобы просмотреть свои товары для продажи, а у Покупателей нет. Однако оба типа пользователей имеют страницу My Account, которую они могут использовать для обновления своей информации.

Возможные варианты дизайна

Наследование одной таблицы

class User < ActiveRecord::Base
  has_one :profile
end

class Seller < User
  has_many :sale_items
end

class Buyer < User
  # nothing here.. I guess this is the "default" user type
end

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


Просто используйте Declarative_authorization или CanCan для добавления функциональности к базовому типу пользователя

class User < ActiveRecord::Base
  has_one :profile
  has_many :sale_items  # only for Sellers
                        # if the user is a seller, allow them to add sale_items
end

Я думал об этом подходе, потому что Продавец - это, по сути, Покупатель с дополнительными функциями, такими как выставление товаров на продажу. Это может привести к большому количеству логики представления. Например if @user.role == "seller" render _some_seller_partial. Мне также не нравится идея проверки жестко закодированной строки в представлении. Ну, я думаю, я мог бы сделать if @user.seller?

Другие варианты дизайна?

Мне действительно интересно услышать, как другие люди будут моделировать это приложение. Я думал об этом уже пару дней.

Ответы [ 3 ]

3 голосов
/ 18 октября 2011

Я бы использовал второй вариант, но с декларативным_авторизацией вместо cancan, и я бы использовал Gem role_model для хранения роли в пользовательской модели.

class User < ActiveRecord::Base
  has_one :profile
  has_many :sale_items  # only for Sellers
                        # if the user is a seller, allow them to add sale_items

  #  t.integer :roles_mask , :default => 0    # for role_model
end

Declarative_authorization немного мощнее, чем CanCan, и я обнаружил, что он лучше масштабируется, когда проекту требуются более / более сложные роли.

Если вы сохраняете свои роли с помощью Gem role_model, они сохраняются в виде растрового изображения в атрибуте role_mask. Это означает, что пользователь может иметь много ролей, например, может быть Продавцом и Покупателем одновременно, а также Администратором или Модератором, если хотите.

См:

http://railscasts.com/episodes/188-declarative-authorization

http://railscasts.com/episodes/189-embedded-association

http://railscasts.com/episodes/192-authorization-with-cancan

http://railscasts.com/episodes/193-tableless-model

И

http://everydayrails.com/2011/10/06/rails-authorization.html

http://www.tonyamoyal.com/2010/07/28/rails-authentication-with-devise-and-cancan-customizing-devise-controllers/

1 голос
/ 18 октября 2011

Я бы выбрал вариант cancan и использовал камень draper для логики представления. Для обоих камней есть Railscasts.

http://railscasts.com/episodes/286-draper

1 голос
/ 18 октября 2011

Я бы выбрал вариант канкан. Это замечательный драгоценный камень, хорошо документированный, простой в использовании, активно поддерживаемый, и у вас есть много учебных пособий (так как это камень, созданный Райаном Бейтсом из Railscasts, вы можете быть уверены, что у вас есть эпизод для него)

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