come generare la migrazione per rendere polimorfici i riferimenti


121

Ho una tabella Prodotti e voglio aggiungere una colonna:

t.references :imageable, :polymorphic => true

Stavo cercando di generare la migrazione per questo facendo:

$ rails generate migration AddImageableToProducts imageable:references:polymorphic

ma ovviamente sto sbagliando. Qualcuno può dare qualche suggerimento? Grazie

Quando provo a inserirlo manualmente dopo aver generato la migrazione, l'ho fatto in questo modo:

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

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

e ancora non ha funzionato


Non una risposta, ma per evitare confusione, sei sicuro di volere questa colonna sui prodotti? La guida alle rotaie ha anche un esempio di prodotti e la colonna è su Pictures guides.rubyonrails.org/…
atomkirk

Risposte:


109

Per quanto ne so, non esiste un generatore integrato per associazioni polimorfiche. Genera una migrazione vuota e quindi modificala manualmente in base alle tue esigenze.

Aggiornamento : dovrai specificare quale tabella stai modificando. Secondo questa risposta SO :

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

Grazie mille Brandon. Sono stato in grado di eseguire la migrazione. Mi chiedevo però, dopo aver creato: polymorphic => true e aperto schema.rb, dovresti vederlo anche nello schema?
railslearner

Dopo aver eseguito la migrazione, schema.rbdovrebbe essere aggiornato, ma non ne parlerà polymorphic. Invece, dovresti vedere i campi effettivi utilizzati da Rails (le guide di Rails hanno maggiori informazioni).
Michelle Tilley

2
Come si aggiunge l'indice alla referencescolonna? Devo indicizzarlo?
mrudult

@mrudult Se non sbaglio, devi aggiungerli tu stesso se ne hai bisogno. Puoi semplicemente aggiungere gli indici come di consueto nel file di migrazione a imageable_typee / o imageable_idsecondo necessità.
Michelle Tilley

2
Sì. aggiunta di indice a imageable_ide ha imageable_typefunzionato. Grazie per l'aiuto.
mrudult

266

Quello che stai cercando di fare non è ancora implementato nella versione stabile di rails, quindi la risposta di Michelle è quella giusta per ora. Ma questa funzionalità sarà implementata in rails 4 ed è già disponibile nella versione edge come segue (secondo questo CHANGELOG ):

$ rails generate migration AddImageableToProducts imageable:references{polymorphic}

1
Ho provato questo su 4.2, e non sono sicuro che sia un bug, zsh o qualcos'altro, ma la riga di comando è stata interpretata come una serie di riferimenti (come tipi) con ogni lettera di polimorfismo, come: t.referencesp: imagable , treferenceso: imagable, etc.
OzBarry

10
@OzBarry, in zsh avresti bisogno di sfuggire alle parentesi graffe: $ rails generate migration AddImageableToProducts imageable: references \ {polymorphic \}
chad_

4
Per chiunque sia curioso, questo genera una migrazione con metodo di modifica contenente:add_reference :products, :imageable, polymorphic: true, index: true
stevenspiel

1
Nel caso in cui qualcuno cerchi di usare lo stesso in scaffold, questo funziona anche con scaffold. Grazie! rijks
sghosh968

2
{polymorphic}deve essere evitato con il guscio di pesce, ad esempio\{polymorphic\}
Dorian

36

Puoi anche fare quanto segue:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.