gpt4 book ai didi

ruby-on-rails - Rails - self 加入 postgresql

转载 作者:行者123 更新时间:2023-11-29 11:59:14 25 4
gpt4 key购买 nike

我有一个名为 section 的自连接模型:

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

带有迁移文件:

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

使用 mySql 很好,但后来我删除了数据库,将它们更改为 postresql(因此它们对 heroku 友好),并创建了新的数据库。尝试 rails db:migrate 后出现错误:

StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedTable: ERROR: relation "parent_sections" does not exist

可能发生了什么? mysql 和 postgresql 中的自连接有什么区别吗?

最佳答案

您的t.references 调用:

t.references :parent_section, foreign_key: true

将尝试用 PostgreSQL 做两件事:

  1. 添加一个名为 parent_section_id 的整数列。
  2. 添加 foreign key constraint在数据库内部以确保参照完整性(即确保 parent_section_id 中的值引用存在的部分)。

您的问题出在 2 上。对于 t.references :parent_section,FK 看起来像:

parent_section_id integer references parent_sections(id)

因为它使用标准的 Rails 命名约定,这就是您的 parent_sections 错误的来源。您可以为 FK 约束指定目标表,就像您可以将 :class_name 提供给 belongs_to 一样:

t.references :parent_section, :foreign_key => { :to_table => :sections }

此修复会触发您的下一个问题:您无法为不存在的表创建 FK,并且 sections 在您的 create_table :sections 之前不会存在 block 执行完毕。

这个问题有两种常见的解决方案:

  1. 创建包含所有列的表,然后添加 FK 约束。在你的迁移中是这样的:

    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
  2. 创建没有引用列 (parent_section_id) 的表,然后添加引用列和 FK。在你的迁移中是这样的:

    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

关于ruby-on-rails - Rails - self 加入 postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39562919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com