3

sagen, dass ich die folgenden Modelle haben:Wie finde ich die Eltern eines Kindes über eine Zuordnung von has_one in Rails3?

class Parent < ActiveRecord::Base 
    has_one :child 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

Ich mag würde die Eltern durch das Kind retrive, doch irgendwie wie folgt vorgehen: Ich finde das Modell in der folgenden Art und Weise über einen Controller

@child = Child.find(params[:child_id]) 

(nicht sicher, ob dies relevant ist, aber da ich flach Routing bin mit der parent_id ist in der URL nicht verfügbar)

Aus meiner Sicht würde ich mag einen Elternteil des Kindes wie folgt abzurufen:

@child.parent 

Wie würde ich dabei vorgehen?

Danke!

Update: mein Beispiel (wenn ich beschlossen, eine neue App zu starten und zu erstellen) lief tatsächlich perfekt. In meiner aktuellen App habe ich vergessen, belongs_to :parent in das Modell des Kindes aufzunehmen. Wie dumm von mir. Danke, dass du dir die Zeit genommen hast, zu kommentieren und zu antworten, Leute. Nächstes Mal werde ich genauer hinschauen, bevor ich hier eine Frage stelle.

+1

'@ child.parent' sollte funktionieren; was ist das Problem? – Zabba

+0

das Problem ist, dass ich nicht genau genug hinsah. Siehe Aktualisierung. –

Antwort

9

Genau so machen Sie es.

Die Tatsache, dass es nicht funktioniert schlägt vor, dass es ein zugrunde liegendes Problem gibt, das verhindert, dass @child einen Elternteil hat.

Als Erstes überprüfen Sie, ob die Tabelle für Child einen Fremdschlüssel enthält. Die Fremdschlüsselspalte (in diesem Fall parent_id) sollte immer auf dem Modell mit der belongs_to Zuordnung stehen.

Zweitens, überprüfen Sie, ob das Kind, das Sie holen, tatsächlich ein Elternteil hat. Dies bedeutet, dass der Fremdschlüssel (parent_id) nicht Null sein sollte. Wenn es einen numerischen Wert hat, überprüfen Sie, ob die Tabelle für Parent einen Datensatz mit dem gleichen Wert wie der Foreign_key in Child enthält.

Sie können auch die Rails-Konsole (rails console aus Ihrem Anwendungsverzeichnis) verwenden, um Zuordnungen zu überprüfen. Tun Sie Child.first.parent und sehen Sie, was vor sich geht. Natürlich können Sie auch Varianten wie Parent.first.child oder Child.find(123).parent verwenden, aber Sie können params nicht verwenden.