2012-03-14 69 views
2

我希望创建一个多态类(User)作为特定类型,稍后根据对象的类型使用它。在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。 – 2012-03-14 23:18:23