我正在使用 devise 进行应用程序身份验证。我有一个 User
模型,它是登录/注册模型。
功能是这样的,即当客户即用户注册时,他将被带到填写强制性用户配置文件页面。使用设计一切正常。
现在我有了一个新功能,用户可以是不同的类型(比如说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 的魔法 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/