Rails:删除外键约束

use*_*773 6 ruby-on-rails rails-migrations

我与用户和学期有以下关联。我创建了以学期ID作为外键的用户表。因此,如果不存在学期ID,则不会创建用户。但是在注册表格中,学期ID是可选的。

class User < ApplicationRecord
  belongs_to :semester
end
class Semester < ApplicationRecord
  has_many :users
end
    class CreateUsers < ActiveRecord::Migration[5.1]
      def change
        create_table :users do |t|
          t.string :email
          t.references :semester, foreign_key: true
          t.timestamps
        end
      end
    end
Run Code Online (Sandbox Code Playgroud)

那么,如何创建另一个迁移来删除外键约束呢?因此,在用户表中,我应该有两列email和semester_id,但semester_id不应具有外键约束,因为它是一个可选字段。

max*_*max 11

class RemoveSemestersFKFromUsers < ActiveRecord::Migration[5.1]
  def change
    if foreign_key_exists?(:users, :semesters)
      remove_foreign_key :users, :semesters
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

请记住将关联设置为optional: true也删除存在验证。

  • 如果该列也不能为空,您可能需要执行“change_column :users, :semester_id, :integer, null: true”。 (2认同)

Ben*_*Ben -1

在您的模型中将参考设置为可选:

class User < ApplicationRecord
  belongs_to :semester, optional: true
end
Run Code Online (Sandbox Code Playgroud)

请参阅此处,4.1.2.11

  • 显然是“remove_foreign_key”。 (2认同)