设计:使用单表继承实例current_user

时间:2012-06-19 17:57:24

标签: ruby-on-rails ruby-on-rails-3 devise single-table-inheritance

我正在使用rails 3.0.9并设计用于身份验证。现在我正在尝试使用单表继承,因为我需要使用多态,所以我有两个类:UserType1和UserType2,它继承自User类。我根据用户的类型正确地需要Devise实例current_user。

例如,

class User < ActiveRecord::Base
 #devise and other user logic 
end

class UserType1 < User
  def get_some_attribute
     return "Hello, my type is UserType1"
  end
end

class UserType2 < User
  def get_some_attribute
   return "Hello, my type is UserType2"
  end
end

In controller 

class MyController < ApplicationController
  def action
    @message = current_user.get_some_attribute #depending the type using polymorphism
    render :my_view
  end
end

2 个答案:

答案 0 :(得分:4)

这正是您所需要的:http://blog.jeffsaracco.com/ruby-on-rails-polymorphic-user-model-with-devise-authentication

您需要覆盖应用程序控制器中的登录路径方法,希望它有所帮助。

答案 1 :(得分:1)

您需要在get_some_attribute模型

中添加User方法
Module User < ActiveRecord::Base

   #devise and other user logic 

   def get_some_attribute
      #You can put shared logic between the two users type here
   end

end

然后,在用户子类型中覆盖它,如下所示:

Module UserType1 < User

   def get_some_attribute
      super
      return "Hello, my type is UserType1"
   end

end

Module UserType2 < User

   def get_some_attribute
      super
      return "Hello, my type is UserType2"
   end

end

然后,current_user.get_some_attribute将按预期工作,如果您想阅读有关Ruby中的覆盖方法的更多信息,可以阅读它here

我添加了super,因为我假设您在get_some_attribute中有一些共享逻辑,因为它会在用户模型中调用get_some_attribute,如果您不需要它,可以删除它

祝你好运!