ruby-on-rails - Rails 中多类型注册的多态关联

标签 ruby-on-rails ruby devise polymorphic-associations

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

功能是这样的,即当客户即用户注册时,他将被带到填写强制性用户配置文件页面。使用设计一切正常。

现在我有了一个新功能,用户可以是不同的类型(比如说ABC)

如果用户属于 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 的魔法 type 列。

# 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

关于ruby-on-rails - Rails 中多类型注册的多态关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12669366/

相关文章:

ruby-on-rails - Rails - 在不同 View 中渲染 form_for @user

ruby-on-rails - 为什么我的 RSpec 未加载 Devise::Test::ControllerHelpers?

ruby-on-rails - heroku上带有回形针的文件上传进度条

mysql - Rails - 如何从外部数据库访问表

ruby-on-rails - Ruby 2.1.1,找不到 Railties

ruby - Gem::InstallError: 'nio4r' native gem 需要安装构建工具

ruby-on-rails - Ruby on Rails 超时。我如何 fork 一个进程?

ruby-on-rails - passenger-install-apache2-module 在 ruby​​ 2.0.0 中不工作

ruby-on-rails - 权威 headless 政策

ruby-on-rails - 当应用程序按预期运行时,为什么这些 RSpec 测试会失败?