2016-07-21 6 views
0

Ich verwende Rails 4.2.4. Wie kann ich automatisch mein übergeordnetes Objekt laden, wenn ich das untergeordnete Objekt lade? Ich habeWie lade ich in Rails automatisch mein übergeordnetes Objekt, wenn das untergeordnete Objekt geladen wird?

class MyObject < ActiveRecord::Base 
    belongs_to :address, class_name: 'Address', foreign_key: :address_id, :autosave => true, dependent: :destroy 

Aber wenn ich

@my_object = MyObject.find(params[:id]) 
    puts "address; #{@my_object.address} address_id: #{@my_object.address_id}" 

Der Ausgang nennen ist

address; address_id: 6792 

Was bedeutet, dass kein übergeordnetes Objekt geladen wurde, obwohl klar gibt es eine Adressdatensatz an sie gebunden. Ich möchte, dass es automatisch geladen wird, wenn mein Modell ist. Wie kann ich das machen?

Edit: Als Reaktion auf wishalizer Vorschlag, änderte ich meine Modelle zu

class MyObject < ActiveRecord::Base 
    … 
    belongs_to :address, inverse_of: :my_object 

und

class Address < ActiveRecord::Base 
    has_one :my_object, inverse_of: :address 

aber immer noch den Fehler

NoMethodError (undefined method `includes' for #<MyObject:0x007fb7232415f8>): 
    app/controllers/application_controller.rb:9:in `current_my_object' 
    app/controllers/my_objects_controller.rb:5:in `edit' 

wenn der Vorschlag der Anwendung gegeben.

Antwort

0

Um die Eltern-Beziehung in der Active Relation umfassen .includes verwenden, wenn Sie die Sammlung im Controller erstellen. .includes ist symmetrisch wahr, entweder vom Elternteil zum Kind oder vom Kind zum Elternteil.

Wenn Sie explizit .includes aufrufen, und dann sollten Sie in der Lage sein, das übergeordnete Element aus der untergeordneten Auflistung wie gewünscht zu verweisen.

@my_object = MyObject.find(params[:id]).includes(:address) 

Modell Beziehungen erforderlich [neuer Abschnitt]

Anfügen/inverse_of zu Ihrem Modell Beziehung defs einfügen als solche

Class MyObject 
     belongs_to :address, {...your model rels..}, inverse_of: :my_object 
     ... 
    end 

Sie müssen auch die symmetrischen inverse_of im verwandten Modell erstellen

Class Address 
     has_many :my_objects, {...your model rels..}, inverse_of: :address 
     ... 
    end 
+0

ich meine Linie geändert, was man hatte, „@my_object = MyObject.find (params [: id]). includes (: address) ", hat aber den Fehler" NoMethodError (undefined method 'includes 'für # ):" – Dave

+0

Okay. Ich habe der Antwort über die Verwendung von inverse_of einen Abschnitt hinzugefügt – Elvn

+0

Ich habe keine Validatoren, aber sogar die Bearbeitung des Codes, um "inverse_of" aufzunehmen, führt zu demselben Fehler. Ich stelle meine Modelle in meine Frage. – Dave

0

Bitte schauen Sie in mir it.Correct wenn ich

MyObject.includes falsch bin immer (: Adresse) .referenzen (: Adresse)

0

Aber wenn ich rufe

@my_object = MyObject.find(params[:id]) 
puts "address; #{@my_object.address} address_id: #>{@my_object.address_id}" 

Die Ausgang

address; address_id: 6792 

@my_object.address Aufrufen ist, in f act, Laden des Adressdatensatzes. Ein möglicher Fall, warum @my_object.address leer zeigt ist wahrscheinlich, dass die address mit id=6792 nicht existiert.

Und Val Asensio ist (wishalizer?) Zu korrigieren Vorschlag, die NoMethodError zu beheben, die includes() Funktion in die richtige Position bewegen:

@my_object = MyObject.includes(:address).find(params[:id]) 
Verwandte Themen