ruby-on-rails – 用于轨道中多类型注册的多态关联

我正在使用devise进行应用程序身份验证.我有一个用户模型,它是登录/注册模型.

功能是这样的:当客户端即用户注册时,他将被用来填写强制用户配置文件页面.使用设计一切都很好.

现在我有一个功能,用户可以是不同类型(比如A,B,C)

如果用户是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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...