0

J'utilise Rails 5 avec PostGres 9.5. Je veux créer une clé étrangère à mes adresses des tables de ma table search_codes donc j'ai créé cette migrationComment créer une clé étrangère avec une contrainte de suppression en cascade dans ma migration Rails 5?

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 

Cependant, ce qui est créé est le suivant. Notez la partie en cascade de la contrainte ne semble pas obtenir créé

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) 

Comment puis-je créer une migration avec une contrainte de clé étrangère en cascade à l'aide des rails 5 migration et PostGres?

Répondre

1

On dirait que ReferenceDefinition n'accepte pas l'option on_delete. Vous pouvez spécifier lors de la suppression avec 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 
+0

Cool. Je déteste quand les choses qui devraient fonctionner (comme spécifier "on_delete") ne le font pas. – Dave