Rails中的FOREIGN KEY ON DELETE SET NULL

时间:2018-09-04 18:51:44

标签: ruby-on-rails postgresql

我正在使用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所做的更改?

如何删除学生而不删除所有课程?

1 个答案:

答案 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