2012-03-14 3 views
2

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

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

Вы можете определить 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

Глядя на ваш код, Я делаю одно предположение. 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 
+0

Благодарим за это. Я думаю, что более чистое решение будет заключаться в том, чтобы логика в модели так обозначалась Mik_Die с принятым ответом. –

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