wie man eine Migration erzeugt, um Referenzen polymorph zu machen

121

Ich habe eine Produkttabelle und möchte eine Spalte hinzufügen:

t.references :imageable, :polymorphic => true

Ich habe versucht, eine Migration dafür zu generieren, indem ich Folgendes getan habe:

$ rails generate migration AddImageableToProducts imageable:references:polymorphic

aber ich mache es offensichtlich falsch. Kann jemand einen Vorschlag machen? Vielen Dank

Wenn ich versuche, es nach dem Generieren der Migration manuell einzufügen, habe ich es folgendermaßen gemacht:

class AddImageableToProducts < ActiveRecord::Migration
  def self.up
    add_column :products, :imageable, :references, :polymorphic => true
  end

  def self.down
    remove_column :products, :imageable
  end
end

und es hat immer noch nicht funktioniert

Railslearner
quelle
Keine Antwort, aber um Verwirrung zu vermeiden, möchten Sie diese Spalte zu Produkten wirklich? Die Schienenführung hat sogar ein Produktbeispiel
atomkirk

Antworten:

109

Soweit ich weiß, gibt es keinen eingebauten Generator für polymorphe Assoziationen. Generieren Sie eine leere Migration und ändern Sie sie dann von Hand entsprechend Ihren Anforderungen.

Update : Sie müssen angeben, welche Tabelle Sie ändern. Nach dieser SO Antwort :

class AddImageableToProducts < ActiveRecord::Migration
  def up
    change_table :products do |t|
      t.references :imageable, polymorphic: true
    end
  end

  def down
    change_table :products do |t|
      t.remove_references :imageable, polymorphic: true
    end
  end
end
Michelle Tilley
quelle
Vielen Dank Brandon. Ich konnte die Migration ausführen. Ich habe mich allerdings gefragt, nachdem Sie Folgendes gemacht haben: polymorph => true und Sie schema.rb öffnen. Sollen Sie es auch im Schema sehen?
Railslearner
Nachdem Sie die Migration ausgeführt haben, schema.rbsollte sie aktualisiert werden, aber es wird nichts darüber gesagt polymorphic. Stattdessen sollten Sie die tatsächlichen Felder sehen, die Rails verwendet (die Rails-Handbücher enthalten weitere Informationen).
Michelle Tilley
2
Wie fügt man der referencesSpalte einen Index hinzu ? Muss ich das indizieren?
Mrudult
@mrudult Wenn ich mich nicht irre, müssen Sie sie selbst hinzufügen, wenn Sie sie brauchen. Sie können einfach wie gewohnt Indizes in der Migrationsdatei zu imageable_typeund / oder imageable_idnach Bedarf hinzufügen .
Michelle Tilley
2
Jep. Index hinzufügen imageable_idund imageable_typefunktioniert. Danke für Ihre Hilfe.
Mrudult
266

Was Sie versuchen, ist noch nicht in der stabilen Version von Rails implementiert, daher ist Michelles Antwort vorerst die richtige. Diese Funktion wird jedoch in Schienen 4 implementiert und ist bereits in der Edge-Version wie folgt verfügbar (gemäß diesem CHANGELOG ):

$ rails generate migration AddImageableToProducts imageable:references{polymorphic}
Simon-Olivier
quelle
1
Versuchte dies auf 4.2, und ich bin nicht sicher, ob dies ein Fehler, zsh oder etwas anderes ist, aber die Befehlszeile wurde als eine Reihe von Referenzen (als Typen) mit jedem polymorphen Buchstaben interpretiert, wie: t.referencesp: imagable , treferenceso: vorstellbar, etc.
OzBarry
10
@OzBarry, in zsh müssten Sie den geschweiften Klammern entkommen: $ Rails generieren Migration AddImageableToProducts Imageable: Referenzen \ {polymorphic}
chad_
4
Für alle Neugierigen erzeugt dies eine Migration mit Änderungsmethode, die add_reference :products, :imageable, polymorphic: true, index: true
Folgendes
1
Wenn jemand versucht, dasselbe im Gerüst zu verwenden, funktioniert dies auch mit dem Gerüst. Vielen Dank! rijks
sghosh968
2
{polymorphic}muss mit der Fischschale entkommen werden, zB\{polymorphic\}
Dorian
36

Sie können auch Folgendes tun:

class AddImageableToProducts < ActiveRecord::Migration
  def change
    add_reference :products, :imageable, polymorphic: true, index: true
  end
end
Freddyrangel
quelle
16

Du kannst es versuchen rails generate migration AddImageableToProducts imageable:references{polymorphic}

Hutusi
quelle
3
{ und } müssen mindestens mit der Fischschale entkommen, zB\{polymorphic\}
Dorian
1
Hier ist der Link zur Dokumentation dazu: edgeguides.rubyonrails.org/…
Giovanni Benussi
Danke Giovanni, das ist sehr nützlich.
Hutusi