5

Ich verwende Rails 4 und SQLite. Ich versuche, foreing Schlüssel zu meiner indicators Tabelle hinzuzufügen. Bitte beachten Sie meinen Code untenFremdschlüssel in Schienen 4

class Indicator < ActiveRecord::Base 
    belongs_to :objetive 
    belongs_to :responsible, class_name: "Person" 

end 

Das Migrationsskript:

class AddFksToIndicator < ActiveRecord::Migration 
    def change 
     add_reference :indicators, :objective, index: true 
     add_reference :indicators, :responsible, index: true 
    end 
end 

wenn die Migration laufen alle in Ordnung ist, so habe ich versucht, in der Konsole:

2.0.0p247 :002 > i = Indicator.new 
=> #<Indicator id: nil, name: nil, created_at: nil, updated_at: nil, objective_id: nil, responsible_id: nil> 
2.0.0p247 :002 > i.objective_id = 0 
2.0.0p247 :003 > i.save 

Zu meiner Überraschung der Indikator wurde gespeichert und es gibt keine obective mit ID = 0.

Schließlich überprüfte ich die Anzeige rs Tabellenschema und ich bekomme:

CREATE TABLE "indicators" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "created_at" datetime, "updated_at" datetime, "objective_id" integer, "responsible_id" integer); 
CREATE INDEX "index_indicators_on_objective_id" ON "indicators" ("objective_id"); 
CREATE INDEX "index_indicators_on_responsible_id" ON "indicators" ("responsible_id"); 

Warum gibt es keine Fremdschlüssel auf objective_id und responsible_id ist? Mache ich etwas falsch?

Antwort

0

Wenn Sie add_reference verwenden, müssen Sie foreign_key: true hinzufügen, um die Fremdschlüsselunterstützung mit diesem Aufruf zu erhalten. Zum Beispiel:

add_reference :indicators, :objective, index: true, foreign_key: true

Der Standardwert ist foreign_key: false, wie here in der Dokumentation erwähnt.

Da Sie Ihre Migration bereits ohne einen Fremdschlüssel erstellt haben, müssen Sie eine weitere Migration mit einem Anruf an add_foreign_key erstellen.

Zum Beispiel:

def change 
    # add_foreign_key(from_table, to_table) 
    add_foreign_key :indicators, :objectives 
end 

Hier ist die documentation for add_foreign_key.

Hoffe, das hilft.