我正在处理单表继承问题。我有两种不同类型的用户。用户模型和Trainer模型,Trainer用户应该从User模型继承属性。我在rails控制台中创建了一个用户,一切正常。一旦我尝试创建一个Trainer,我就会收到以下错误。 Rails 5.0.4
ActiveRecord::RecordInvalid: Validation failed: User must exist
我是否错误地设置了模型关联?
这是我的用户模型
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
end
我的培训师模型
class Trainer < User
has_many :appointments
has_many :clients, through: :appointments
end
模型的模式
create_table "trainers", force: :cascade do |t|
t.string "first_name"
t.string "last_name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "type"
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
从我的用户模型中可以看到,我添加了所需的:type column
以下是我的客户和预约的架构
create_table "appointments", force: :cascade do |t|
t.integer "client_id"
t.integer "trainer_id"
t.datetime "appointment_date"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.datetime "start_time"
t.datetime "end_time"
t.integer "status", default: 0
end
create_table "clients", force: :cascade do |t|
t.string "name"
t.string "phone_number"
t.integer "price"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
首先我在控制台中创建了一个用户
User.create!(email:'ryan@test.com', password:'asdfasdf', password_confirmation:'asdfasdf')
然后我在创建培训师时
Trainer.create!(first_name:'Ryan', last_name:'Bent')
培训师和用户应该相关联。但我并不认为我需要使用单表继承添加关联。
答案 0 :(得分:2)
使用单表继承,一个表必须具有任何子类所需的所有属性(more information)。因此,对于您的情况,您还需要将训练者列(first_name,last_name)添加到users
表中,然后用户将在表上留空,并且培训师将填充它们。
如果你想保留单独的表,你正在做的不再是单表,并且需要在2之间进行某种连接。