Создайте как полиморфный тип в Rails - PullRequest
2 голосов
/ 14 марта 2012

Я хочу создать полиморфный класс (Пользователь) как определенный тип и использовать его позже с условиями, зависящими от типа объекта.

class SuperUser < User
class Admin < User
class User

@user = @account.users.new(params[:user])

Это создаст пользователя как пользовательский объект. Единственный способ создать и использовать @user как объект определенного типа - это сделать что-то вроде этого:

@user = Admin.new(params[:user]) if params[:user][:type] == "Admin"
@user = SuperUser.new(params[:user]) if params[:user][:type] == "SuperUser"
@user.account = @account

if @user.is_a? Admin 
 ...
end

....

Итак, есть ли лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Вы можете определить polymorphic_new метод класса для пользователя

class User
  def self.polymorphic_new(params)
    case params[:type]
    when "Admin" then Admin.new(params)
    when "SuperUser" then SuperUser.new(params)
    else new(params)
  end
end 

А потом в контроллере

@user = User.polymorphic_new(params[:user])

Меня не интересует вопрос безопасности ..

0 голосов
/ 14 марта 2012

Глядя на твой код, я делаю одно предположение. params[:user][:type] совпадает с именем класса. Если это так, следующий код должен работать.

if params[:user][:type]
  @user = (params[:user][:type]).constantize.new(params[:user])
  @user.account = @account
else
  @user = @account.users.new(params[:user]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...