Rails - 自我加入postgresql

时间:2016-09-18 21:36:21

标签: ruby-on-rails postgresql heroku rails-activerecord

我有一个名为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中的自联接有什么区别吗?

1 个答案:

答案 0 :(得分:4)

您的t.references :parent_section, foreign_key: true 来电:

parent_section_id

将尝试使用PostgreSQL做两件事:

  1. 添加名为parent_section_id的整数列。
  2. 在数据库中添加How to check null objects in jQuery以确保参照完整性(即确保t.references :parent_section参考部分中的值存在)。
  3. 您的问题是 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 将不存在。

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

    1. 使用所有列创建表,然后添加FK约束。您的迁移中有类似的内容:

      parent_section_id
    2. 创建没有引用列(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