【问题标题】:How do I create a foreign key with a cascading delete constraint in my Rails 5 migration?如何在 Rails 5 迁移中创建具有级联删除约束的外键?
【发布时间】:2018-03-28 10:06:10
【问题描述】:

我正在使用带有 PostGres 9.5 的 Rails 5。我想从我的 search_codes 表中为我的地址表创建一个外键,所以我创建了这个迁移

class CreateSearchCodeTable < ActiveRecord::Migration[5.0]
  def change
    create_table :search_codes do |t|
      t.string :code
      t.references :address, type: :string, index: true, foreign_key: true, on_delete: :cascade
      t.index ["code"], name: "index_search_codes_on_code", unique: true, using: :btree
    end
  end
end

但是,创建的是以下内容。请注意,约束的级联部分似乎没有被创建

myapp=> \d search_codes;
                                Table "public.search_codes"
   Column   |       Type        |                         Modifiers
------------+-------------------+-----------------------------------------------------------
 id         | integer           | not null default nextval('search_codes_id_seq'::regclass)
 code       | character varying |
 address_id | character varying |
Indexes:
    "search_codes_pkey" PRIMARY KEY, btree (id)
    "index_search_codes_on_code" UNIQUE, btree (code)
    "index_search_codes_on_address_id" btree (address_id)
Foreign-key constraints:
    "fk_rails_6bd9792e3b" FOREIGN KEY (address_id) REFERENCES addresses(id)

如何使用 Rails 5 迁移和 PostGres 创建具有级联外键约束的迁移?

【问题讨论】:

    标签: postgresql foreign-keys migration ruby-on-rails-5 cascading-deletes


    【解决方案1】:

    好像ReferenceDefinition 不接受on_delete 选项。您可以使用add_foreign_key 指定删除时:

    class CreateSearchCodeTable < ActiveRecord::Migration[5.0]
      def change
        create_table :search_codes do |t|
          t.string :code
          t.references :address, type: :string, index: true
          t.index ["code"], name: "index_search_codes_on_code", unique: true, using: :btree
        end
    
        add_foreign_key :search_codes, :addresses, on_delete: :cascade
      end
    end
    

    【讨论】:

    • 酷。当本应有效的事情(例如指定“on_delete”)无效时,我讨厌它。
    【解决方案2】:

    从这个链接获取以前版本的 Rails, Option for Cascade Delete for References or On Delete

    这个 t.references :parent, index: true, foreign_key: {on_delete: :cascade}

    似乎有效

    编辑:请注意,您似乎也不需要'index:true'。它也会创建一个索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 2019-04-26
      • 2011-08-06
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多