8 Stimmen

Polymorphe Assoziation

Wenn Sie polymorphe belongs_to-Assoziationen haben, fügt references beide erforderlichen Spalten hinzu:

create_table :products do |t|
  t.references :attachment, :polymorphic => {:default => 'Photo'}

fügt eine attachment_id-Spalte und eine Zeichenfolge attachment_type-Spalte mit einem Standardwert von 'Photo' hinzu.

Was bedeutet das genau?

6voto

Gdeglin Punkte 12205

Hier finden Sie die Dokumentation zur Methode references: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#M001938

Der Code der references Methode sieht wie folgt aus:

497: def references(*args)
498: options = args.extract_options!
499: polymorphic = options.delete(:polymorphic)
500: args.each do |col|
501: column("#{col}_id", :integer, options)
502: column("#{col}_type", :string, polymorphic.is_a?(Hash) ? polymorphic : options) unless polymorphic.nil?
503: end
504: end

Wie Sie sehen können, fügt es sowohl eine [col]_id als auch eine [col]_type Spalte zur Tabelle hinzu.

Es ist das Gleiche wie:

create_table :products do |t|
t.integer :attachment_id
t.string :attachment_type, :default => 'Photo'
end

Polymorphe Beziehungen werden verwendet, um eine Art von Objekten mit mehreren Arten von anderen Objekten zu verbinden.

Ein gutes Beispiel wäre eine Anwendung, die Tags unterstützt, wobei Tags mit sowohl Produkten als auch Kategorien verbunden werden können.

In Ihrem Beispiel sieht es so aus, als ob Produkte an mehrere Arten von Objekten angehängt werden könnten, wobei die Standardart von Objekt ein Foto ist. (attachment_type wäre "Photo" und attachment_id wäre die ID einer Zeile in der Tabelle 'photos')

4voto

Rishav Rastogi Punkte 15487

Grundsätzlich fügt die polymorphe Assoziation laut Definition die Möglichkeit hinzu, Assoziationen mit vielen anderen Rails-ActiveRecord-Modellen zu erstellen.

Beide Spalten sind dafür da, dass Rails weiß, auf welches Modell sich die Assoziation bezieht. Du hast die Spalte attachment_type (z. B. String) (Standardwert ist "Photo", Tabellenname: photos in der db), und die attachment_id ist sozusagen ein Fremdschlüssel zu diesem bestimmten Modell/Tabelle (z. B. Photo).

In der Regel bietet Ihnen dies die Flexibilität, ein Modell mit vielen anderen zu verknüpfen.

0voto

Ryan Bigg Punkte 104835

Polymorph bedeutet, dass es zu verschiedenen Objekten (oder verschiedenen Datensätzen in verschiedenen Tabellen) gehören kann. Die Art und Weise, wie es dies bestimmt, basiert auf den Typ- und ID-Feldern. Wenn Ihre Verbindung nicht polymorph wäre, gäbe es nur ein _id-Feld.

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