Я разрабатываю приложение, у которого есть два [три, включая администраторов] типа пользователей: покупатели и продавцы. Когда пользователь регистрируется, предполагается, что он регистрируется, чтобы просто купить что-то [аккаунт покупателя]. Однако, если они хотят стать Продавцом, у них должна быть возможность выставить свои товары на продажу, [стать Продавцом]. Это становится важным, так как пользователи могут переключаться между типами учетных записей.
Конечно, Продавец также может покупать товары.
Проблема
Проблема, с которой я сталкиваюсь, заключается в том, что у Продавцов есть 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?
Другие варианты дизайна?
Мне действительно интересно услышать, как другие люди будут моделировать это приложение. Я думал об этом уже пару дней.