我有一个名为section的自连接模型:
<color name="colorPrimary">#00838F</color>
使用迁移文件:
class Section < ApplicationRecord
belongs_to :offer
# Self joins:
has_many :child_sections, class_name: "Section", foreign_key: "parent_section_id"
belongs_to :parent_section, class_name: "Section", optional: true
end
使用mySql很好,但后来我删除了数据库,将它们更改为postresql(因此它们是友好的),并创建了新的数据库。尝试class CreateSections < ActiveRecord::Migration[5.0]
def change
create_table :sections do |t|
t.string :name
t.references :offer, foreign_key: true
t.references :parent_section, foreign_key: true
t.timestamps
end
end
end
后出现错误消息:
rails db:migrate
可能发生了什么? mysql和postgresql中的自联接有什么区别吗?
答案 0 :(得分:4)
您的t.references :parent_section, foreign_key: true
来电:
parent_section_id
将尝试使用PostgreSQL做两件事:
parent_section_id
的整数列。t.references :parent_section
参考部分中的值存在)。您的问题是 2 。对于parent_section_id integer references parent_sections(id)
,FK看起来像:
parent_sections
因为它使用标准的Rails命名约定,这就是:class_name
错误的来源。您可以为FK约束指定目标表,就像您可以将belongs_to
提供给t.references :parent_section, :foreign_key => { :to_table => :sections }
一样:
sections
此修复程序会触发您的下一个问题:您无法为不存在的表创建FK,并且在create_table :sections
块执行完毕之前create_table :sections do |t|
t.string :name
t.references :offer, foreign_key: true
t.references :parent_section
t.timestamps
end
add_foreign_key :sections, :sections, :column => :parent_section_id
将不存在。
这个问题有两种常见的解决方案:
使用所有列创建表,然后添加FK约束。您的迁移中有类似的内容:
parent_section_id
创建没有引用列(create_table :sections do |t|
t.string :name
t.references :offer, foreign_key: true
t.timestamps
end
change_table :sections do |t|
t.references :parent_section, :foreign_key => { :to_table => :sections }
end
)的表,然后添加引用列和后面的FK。您的迁移中有类似的内容:
kindsViewController.swift