我跟用户和学期有关联。我创建了用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不应该有外键约束,因为它是一个可选字段。
答案 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
表中继承的Student
和Users
模型
首先,创建一个迁移,以将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
仅此而已。
我希望这会有所帮助