2 Stimmen

Eager loading Verbindung auf einer Unterklasse

Ich habe die folgende (vereinfachte) Klassenhierarchie:

def Parent < ActiveRecord::Base end
def Child < Parent
  belongs_to :other
end
def Other < ActiveRecord::Base end

Ich möchte alle Elternobjekte abrufen und - wenn sie Kindobjekte sind - das :other-Beziehungsobjekt im Voraus laden. Also hatte ich gehofft, ich könnte Folgendes tun:

Parent.find(:all, :include => [:other])

Aber wie ich befürchtet hatte, erhalte ich die Nachricht: "Die Beziehung mit dem Namen 'other' wurde nicht gefunden; haben Sie sie vielleicht falsch geschrieben?"

Was ist der beste Weg, um im Rahmen dieses Szenarios ein Vorausladen zu etablieren?

[Bearbeiten] Wie angefordert, hier ist das konkretere Beispiel:

  • Eltern = Ereignis
  • Kind = PostEreignis
  • Anderes = Beitrag

Ich möchte verschiedene Arten von Ereignissen protokollieren, jeweils mit eigenen Eigenschaften (einige davon sind Verweise auf andere Objekte), wie im obigen Beispiel. Gleichzeitig möchte ich alle Ereignisse auflisten können, die aufgetreten sind, daher die Elternklasse.

2voto

Alex Reisner Punkte 28344

Kannst du die belongs_to :other Assoziation im Parent Modell definieren? Es wird für jedes Parent Objekt nicht relevant sein, aber das ist die Natur von STI: du wirst fast immer irgendeine Spalte haben, die nicht von jedem Kind verwendet wird.

Wenn du die Assoziation wirklich nicht zum Elternteil verschieben kannst, musst du möglicherweise in zwei Schritten laden, zum Beispiel:

Parent.find(:all, :conditions => "type != 'Child'") +
  Child.find(:all, :include => [:other])

1voto

bensie Punkte 5333

Da Child von Parent erbt (und nicht umgekehrt), hat Parent keine Kenntnis der belongs_to :other Zuordnung.

Ich denke, du solltest darüber nachdenken, wie du deine App modellierst. Vielleicht würden einige Details zu deinen tatsächlichen Modellen einige Antworten auf alternative Methoden dessen geben, was du zu erreichen versuchst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X