我正在使用Rails中的两个模型
class Student < ApplicationRecord
belongs_to :school
has_many :lessons
end
和
class Lesson < ApplicationRecord
belongs_to :student, optional: true
end
我真的希望这能导致Oracle使用FOREIGN KEY ON DELETE SET NULL
在执行rails db:migrate:reset之后 我得到了一行生成的db / schema.rb
add_foreign_key "lessons", "students"
鉴于我的模型,这不是我期望的,所以 我将其手动修改为
add_foreign_key "lessons", "students", on_delete: :nullify
无论我做什么,每次尝试删除有课程的学生时,都会遇到外键违反问题。
为什么schema.rb不能首先反映模型?
为什么这些表不能反映我手动对schema.rb所做的更改?
如何删除学生而不删除所有课程?
答案 0 :(得分:0)
为什么schema.rb不能首先反映模型?
因为rails db:migrate:reset使用db / migrate中的文件来生成数据库,而不是app / models文件
找出正确的“ rails generate”命令以创建正确的
db / migrate / timestamp_do_this_or_that.rb
文件或选择一个现有的(后来的)db / migrate / timestamp_do_this_or_that.rb文件,并在“ def change”和“ end”之间添加以下行:
add_foreign_key "lessons", "students", on_delete: :nullify
rails db:migrate:reset
rails db:seed
任何学生都可以被删除,即使他/她已经上过课,而他们在课表中的ID现在为“ nil”
为什么这些表不能反映我手动对schema.rb所做的更改?
我不能肯定地说,但是也许自动生成的schema.rb文件仅供参考。它确实在文件顶部的注释中说:
# Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition