我正在使用Devise gem中的父类User
:
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
validates :first_name, presence: true, length: { maximum: 256 }
validates :last_name, presence: true, length: { maximum: 256 }
def full_name
first_name + ' ' + last_name
end
end
我想在我的项目中使用两种类型的帐户,例如Participant
和Mentor
。只要我读过,这是使用单表继承(STI)的好方法,但我新添加的字段不会出现在模型中。
我有以下迁移文件:
class CreateParticipants < ActiveRecord::Migration[5.1]
def change
create_table :participants do |t|
t.string :team_name
t.references :mentor
t.timestamps
end
end
end
和
class CreateMentors < ActiveRecord::Migration[5.1]
def change
create_table :mentors do |t|
t.timestamps
end
end
end
简单地说,我希望拥有一个Participant
模型,其中我有team_name
字段以及与Mentor
模型的外键关系。
participant.rb
:
class Participant < User
# _________________^
validates :team_name, presence: true, length: { maximum: 500 }
belongs_to :mentor
end
mentor.rb
:
class Mentor < User
# ____________^
has_many :participants
end
但新添加的字段不会显示,但它们显示在db/schema.rb
。
答案 0 :(得分:0)
在STI中,子模型在数据库中没有特定的表。所有孩子共享父表。您可以在子类中定义新方法和属性,但是如果要在数据库中保存,则必须在父表中创建这些字段。如果您需要许多字段,这不是一个好的选择,因为其中许多字段可能为空(如果用户不是参与者)
如果您需要保存有关儿童的更多信息,您可以使用其他方法,例如多态关联:http://guides.rubyonrails.org/association_basics.html(第2.9章)