Rails:删除外键约束

时间:2018-03-06 09:18:56

标签: ruby-on-rails rails-migrations

我跟用户和学期有关联。我创建了用semester 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

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

3 个答案:

答案 0 :(得分:4)

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

请记住将关联设置为optional: true以删除状态验证。

答案 1 :(得分:0)

在模型中使引用可选:

class User < ApplicationRecord
  belongs_to :semester, optional: true
end

See here,4.1.2.11

答案 2 :(得分:0)

在Rails 6应用程序上工作时,我遇到了同样的问题。

这是我的解决方法

我有一个Users表和一个Roles表。我希望Users表属于Roles表,我想将Roles表的引用添加到Users表中。我还有一个Admin表中继承的StudentUsers模型

首先,创建一个迁移,以将Roles表的引用添加到Users表中:

rails generate migration AddRoleRefToUsers role:references

这将创建一个包含以下内容的迁移文件:

class AddRoleRefToUsers < ActiveRecord::Migration[6.0]
  def change
    add_reference :users, :role, null: false, foreign_key: true
  end
end

只需将null: false更改为null: true。这样我们就可以了;

class AddRoleRefToUsers < ActiveRecord::Migration[6.0]
  def change
    add_reference :users, :role, null: true, foreign_key: true
  end
end

然后迁移数据库:

rails db:migrate

最后,检查您的user模型:

它将包含以下内容:

class User < ApplicationRecord
  belongs_to :role
end

只需将optional: true添加到belongs_to关联中。这样我们就可以:

class User < ApplicationRecord
  belongs_to :role, optional: true
end

仅此而已。

我希望这会有所帮助