2016-05-04 4 views
0

Ich habe eine Step Klasse, die je nach model ein Ursprung, ein Schritt oder ein Ziel sein kann. Und eine Route Klasse, die einen Ursprung und Ziel wie unten enthält:ActiveRecord: dependent =>: Löschen mit falschem ID-Attribut

class Route < ActiveRecord::Base 
    has_one :origin, -> {where(model: "origin")}, class_name: "Step", :foreign_key => "origin_id", :dependent => :delete 
    has_one :destination, -> {where(model: "destination")}, class_name: "Step", :foreign_key => "destination_id", :dependent => :delete 

Ich möchte die verknüpften Schritte löschen, wenn ich eine Route zu zerstören, aber ich habe diesen Fehler: ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: steps.origin_id

Wie kann ich erklären, AR dass es steps.id und nicht steps.origin_id finden muss?

Hier ist mein Schema.

create_table "steps", force: :cascade do |t| 
    t.string "model" 
    t.float "lat" 
    t.float "lng" 
    t.text  "formatted_address" 
    t.string "vicinity" 
    t.string "name" 
    t.integer "distance" 
    t.integer "duration" 
    t.integer "tour_id" 
    t.datetime "created_at",   null: false 
    t.datetime "updated_at",   null: false 
    end 

    add_index "steps", ["tour_id"], name: "index_steps_on_tour_id" 

    create_table "routes", force: :cascade do |t| 
    t.integer "origin_id" 
    t.integer "destination_id" 
    t.integer "user_id" 
    t.datetime "created_at",  null: false 
    t.datetime "updated_at",  null: false 
    end 

    add_index "routes", ["user_id"], name: "index_routes_on_user_id" 
+0

Spezifizieren Sie den Fremdschlüssel nicht selbst hier: ': foreign_key =>" origin_id "'? Wenn in der "Schritt" -Tabelle kein Fremdschlüssel vorhanden ist, nehme ich an, dass Sie in Ihrer "Routen" -Tabelle "step_id" haben. – Uzbekjon

+1

Auf welcher Tabelle sind die 'origin_id' und' destination_id' definiert? Wenn es die "Routen" -Tabelle ist, dann haben Sie die Assoziationen in umgekehrter Richtung und Sie sollten 'gehört_to' anstelle von' has_one' verwenden. – BoraMa

+0

zeigen Sie bitte Ihr Schema. – uday

Antwort

1

Es stellte sich heraus, dass dies ein Problem mit den in umgekehrter Richtung definierten Zuordnungen war.

Unter Rails ist die Konvention folgende: das Modell dessen Tabelle enthält den Fremdschlüssel, verwendet belongs_to für die Verknüpfungen. Die anderen Modelle, die keine Fremdschlüssel auf ihren Tischen haben, verwenden has_one, has_many etc. für Assoziationen.

So in diesem Fall die Verbände in Route sollen wie folgt aussehen:

class Route < ActiveRecord::Base 
    belongs_to :origin, -> {where(model: "origin")}, class_name: "Step", :foreign_key => "origin_id", :dependent => :delete 
    belongs_to :destination, -> {where(model: "destination")}, class_name: "Step", :foreign_key => "destination_id", :dependent => :delete 
end 

Siehe this chapter in dem Rails für weitere Informationen führen.

Verwandte Themen