ActiveRecord :: RecordInvalid:验证失败:用户必须存在

时间:2017-07-06 18:00:11

标签: ruby-on-rails ruby activerecord

我正在处理单表继承问题。我有两种不同类型的用户。用户模型和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')

培训师和用户应该相关联。但我并不认为我需要使用单表继承添加关联。

1 个答案:

答案 0 :(得分:2)

使用单表继承,一个表必须具有任何子类所需的所有属性(more information)。因此,对于您的情况,您还需要将训练者列(first_name,last_name)添加到users表中,然后用户将在表上留空,并且培训师将填充它们。

如果你想保留单独的表,你正在做的不再是单表,并且需要在2之间进行某种连接。