2010-08-15 16 views
5

Ich habe ein Elternobjekt, Post, das die folgenden Kinder hat.Umgekehrte polymorphe Assoziationen

has_one :link 
has_one :picture 
has_one :code 

Diese Kinder schließen sich gegenseitig aus.

Gibt es eine Möglichkeit, polymorphe Verknüpfungen in umgekehrter Reihenfolge zu verwenden, so dass ich die Felder link_id, picture_id und code_id in meiner Post-Tabelle nicht haben muss?

+0

Wäre es sinnvoll, wenn das Foto eine Beziehung hat: has_many? Dann könnten Sie tun, was Sie suchen .. – Trip

Antwort

0

Ich glaube, Sie suchen nach der :as Option für has_one. Sie können den Namen des Assoziationsendes belongs_to angeben.

Wenn alle Stricke reißen, lesen Sie die Dokumentation: http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one

+0

Vielleicht vermisse ich etwas, aber wie würde ich eine dynamische Verbindung mit einem Kind erstellen mit: als? Ich verstehe Polymorphismus in Bezug darauf, wie ein Kindobjekt jede Art von Elternobjekt haben könnte. Aber was ich frage ist, wie ein Elternobjekt einen beliebigen Typ von Kindobjekt haben kann. Ich möchte etwas wie @ post.postable tun und das Kind-Objekt, das einer der Link, Bild oder Code sein würde. –

0

Gibt es eine Möglichkeit polymorphen Verbände in umgekehrter Richtung zu verwenden, so dass ich nicht link_id haben müssen, picture_id und code_id Felder in mein Post-Tabelle?

has_one bedeutet, dass der Fremdschlüssel in der Tabelle anderen ist. Wenn Sie Ihr Modell auf diese Weise definiert haben, werden Sie in Ihrer Post-Tabelle keine link_id, picture_id und code_id haben. Ich glaube, du wolltest sagen belongs_to.

Ich will etwas tun, wie @ post.postable und bekommen das Kind Objekt, das eines der Link wäre, Bild oder Code.

Ich glaube, Sie könnten dies tun durch STI mit und Kombinieren der links, pictures und codes Tabellen, dann die Art des Modells zu testen, wenn das Abrufen. Das scheint jedoch klugdy und könnte mit vielen ungenutzten Spalten enden.

Gibt es einen Grund, die ungenutzten ID-Spalten nicht zu speichern, außer Platz zu sparen? Wenn Sie bereit sind, sie zu halten, dann könnten Sie ein virtuelles Attribut definieren und eine postable_type Spalte: (ungetestet Code kann spektakulär scheitern)

def postable 
    self.send(self.postable_type) 
end 

def postable=(p) 
    self.send(postable_type.to_s+"=",p) 
end 
+0

Ich suche nur nach einer eleganteren Art, Dinge zu tun, als mehrere * _id-Spalten zu haben. Obwohl dieser Thread beweist, ist der Ansatz mit mehreren * _id Spalten wahrscheinlich der einfachste und der beste. –

Verwandte Themen