Rails STI为子项添加其他字段

时间:2018-02-16 21:10:52

标签: ruby-on-rails ruby database sti

我正在使用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

我想在我的项目中使用两种类型的帐户,例如ParticipantMentor。只要我读过,这是使用单表继承(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

1 个答案:

答案 0 :(得分:0)

在STI中,子模型在数据库中没有特定的表。所有孩子共享父表。您可以在子类中定义新方法和属性,但是如果要在数据库中保存,则必须在父表中创建这些字段。如果您需要许多字段,这不是一个好的选择,因为其中许多字段可能为空(如果用户不是参与者)

如果您需要保存有关儿童的更多信息,您可以使用其他方法,例如多态关联:http://guides.rubyonrails.org/association_basics.html(第2.9章)