我正在使用devise进行应用程序身份验证.我有一个用户模型,它是登录/注册模型.
该功能是这样的:当客户端即用户注册时,他将被用来填写强制用户配置文件页面.使用设计一切都很好.
如果用户是A类型,那么他必须遵循相同的注册过程和相同的个人资料页面.
如果用户是B类型,则注册屏幕会有所不同,等待管理员验证. C型也有不同的变化.
所有不同类型都有不同的个人资料页面,字段不同.
所以我决定有一个多态关联,这就是我的模型的样子
class User < ActiveRecord::Base devise :database_authenticatable,:registerable,:recoverable,:rememberable,:trackable,:validatable attr_accessible :email,:password,:password_confirmation,:remember_me belongs_to :user_type,:polymorphic => true end class A has_one :user,:as => :user_type end class B has_one :user,:as => :user_type end class C has_one :user,:as => :user_type end
解决方法
你想要Rails的魔法类型列.
# user.rb class User < ActiveRecord::Base # create_table 'users' do |t| # t.string :name # t.string :type # end end # user_a.rb class UserA < User end # user_b.rb class UserB < User end # user_c.rb class UserC < User end
UserA.create(name: "bricker") user_a = User.where(type: "UserA").first same_user_a = UserA.all.first user_a == same_user_a #=> true user_a.class #=> UserA user_a.is_a? User #=> true
更新
class UserLogin < ActiveRecord::Base # create_table :user_logins do |t| # t.integer :user_id # t.string :user_type # t.string :login # t.string :encrypted_password # end # devise ... belongs_to :user,polymorphic: true end class User < ActiveRecord::Base self.abstract_class = true has_one :user_login,as: :user end class Admin < User # create_table :admins do |t| # t.integer :user_login_id # t.string :admin_name # end end class Moderator < User # create_table :moderators do |t| # t.integer :user_login_id # t.string :moderator_name # end end