Ruby:如何为Active Record关联模型手动设置种子数据
问题描述
我正在尝试手动配置Seeds.rb中的数据,需要建立以下Active Record关联:Doctor拥有多个Patient,Patient属于一个Doctor,Patient拥有多个Chart,Doctor可通过Patient访问Chart。但不清楚手动创建数据时如何关联这三个模型。
以下是我的模型定义与迁移文件:
- Doctor.rb模型:
class Doctor < ActiveRecord::Base has_many :patients has_many :charts , through: :patients end
- Doctor迁移文件:
class CreateDoctors < ActiveRecord::Migration[6.1] def change create_table :doctors do |t| t.string :name , :speciality t.integer :license_number end end end
- Patient.rb模型:
class Patient < ActiveRecord::Base belongs_to :doctor has_many :charts end
- Patient迁移文件:
class CreatePatients < ActiveRecord::Migration[6.1] def change create_table :patients do |t| t.string :name , :gender, :description, :medication t.integer :age t.float :account_balance t.integer :doctor_id , chart_id end end end
- Chart.rb模型:
class Chart < ActiveRecord::Base belongs_to :patient belongs_to :doctor end
- Chart迁移文件:
class CreateCharts < ActiveRecord::Migration[6.1] def change create_table :charts do |t| t.string :chart t.integer :patient_id , :doctor_id end end end
我尝试的种子数据示例(尚未完成关联):
Doctor.create(name: "Aaron Yan", speciality: "Marriage & Family " , license_number: 85477) Patient.create(name: "Danielle Marsh", age: 28, gender: "F", account_balance: 44.23 , description: "Panic Disorder, Insomnia", medication:"Tofranil 25 mg") Chart.create(description: "this patient exhibits the following symptoms, treatment plan is etc")
解决方案
先修正模型和迁移中的冗余配置,再编写正确关联的种子数据:
1. 修正冗余配置
根据你定义的关联逻辑,有些字段和配置属于冗余,需要调整:
- Patient迁移文件:删除多余的
chart_id字段,因为Patient has_many :charts的关联只需要Chart表存patient_id,Patient表不需要记录单个病历ID。
# 修正后的Patient迁移文件 class CreatePatients < ActiveRecord::Migration[6.1] def change create_table :patients do |t| t.string :name, :gender, :description, :medication t.integer :age t.float :account_balance t.integer :doctor_id # 仅保留关联Doctor的外键 end end end
- Chart模型与迁移:删除
belongs_to :doctor和doctor_id字段,因为Doctor是通过Patient间接访问Chart的(has_many :charts, through: :patients),直接关联会造成数据冗余。如果确实需要Chart直接关联Doctor,可以保留,但你的需求场景下间接关联已足够。
# 修正后的Chart模型 class Chart < ActiveRecord::Base belongs_to :patient end
# 修正后的Chart迁移文件 class CreateCharts < ActiveRecord::Migration[6.1] def change create_table :charts do |t| t.string :chart t.integer :patient_id # 仅保留关联Patient的外键 end end end
2. 编写带关联的种子数据
有两种常用写法,都能正确建立模型关联:
方法一:直接设置外键
通过保存模型实例后,直接给子模型指定外键ID:
# 创建医生实例 doctor = Doctor.create(name: "Aaron Yan", speciality: "Marriage & Family", license_number: 85477) # 创建患者并关联医生 patient = Patient.create( name: "Danielle Marsh", age: 28, gender: "F", account_balance: 44.23, description: "Panic Disorder, Insomnia", medication: "Tofranil 25 mg", doctor_id: doctor.id ) # 创建病历并关联患者 Chart.create( chart: "this patient exhibits the following symptoms, treatment plan is etc", patient_id: patient.id )
方法二:使用Active Record关联方法(更贴合Rails风格)
通过模型的关联方法直接创建子模型,自动填充外键:
# 创建医生 doctor = Doctor.create(name: "Aaron Yan", speciality: "Marriage & Family", license_number: 85477) # 通过医生的patients关联方法创建患者,自动关联doctor_id patient = doctor.patients.create( name: "Danielle Marsh", age: 28, gender: "F", account_balance: 44.23, description: "Panic Disorder, Insomnia", medication: "Tofranil 25 mg" ) # 通过患者的charts关联方法创建病历,自动关联patient_id patient.charts.create( chart: "this patient exhibits the following symptoms, treatment plan is etc" )
3. 验证关联有效性
运行种子数据后,可在Rails控制台验证关联是否正常:
# 查看医生的所有患者 Doctor.first.patients # 查看医生的所有病历(通过患者关联) Doctor.first.charts # 查看患者所属的医生 Patient.first.doctor # 查看患者的所有病历 Patient.first.charts
内容的提问来源于stack exchange,提问作者XiaoZhu
相关产品推荐
相关产品推荐

