cómo generar migración para hacer referencias polimórficas

121

Tengo una tabla de productos y quiero agregar una columna:

t.references :imageable, :polymorphic => true

Intenté generar migración para esto haciendo:

$ rails generate migration AddImageableToProducts imageable:references:polymorphic

pero obviamente lo estoy haciendo mal. ¿Alguien puede hacer alguna sugerencia? Gracias

Cuando trato de ponerlo manualmente después de generar la migración, lo hice así:

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

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

y todavía no ha funcionado

railslearner
fuente
No es una respuesta, pero para evitar confusiones, ¿está seguro de que desea esta columna sobre Productos? La guía de rieles incluso tiene un ejemplo de Productos y la columna está en Pictures guides.rubyonrails.org/…
atomkirk

Respuestas:

109

Hasta donde sé, no hay un generador incorporado para asociaciones polimórficas. Genere una migración en blanco y luego modifíquela a mano según sus necesidades.

Actualización : deberá especificar qué tabla está cambiando. De acuerdo con esta respuesta 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
Michelle Tilley
fuente
Muchas gracias Brandon. Pude ejecutar la migración. Sin embargo, me preguntaba, después de que haces: polymorphic => true y abres schema.rb ¿se supone que también debes verlo en el esquema?
railslearner
Después de ejecutar la migración, schema.rbdebería actualizarse, pero no dirá nada al respecto polymorphic. En su lugar, debería ver los campos reales que utiliza Rails (las Guías de Rails tienen más información).
Michelle Tilley
2
¿Cómo agrega índice a la referencescolumna? ¿Necesito indexar eso?
mrudult
@mrudult Si no me equivoco, debe agregarlos si los necesita. Simplemente puede agregar índices de forma normal en el archivo de migración imageable_typey / o imageable_idsegún sea necesario.
Michelle Tilley
2
Sip. agregando índice imageable_idy imageable_typetrabajado. Gracias por tu ayuda.
mrudult
266

Lo que está intentando hacer aún no está implementado en la versión estable de rails, por lo que la respuesta de Michelle es la correcta por ahora. Pero esta característica se implementará en los rieles 4 y ya está disponible en la versión de borde de la siguiente manera (de acuerdo con este CAMBIO ):

$ rails generate migration AddImageableToProducts imageable:references{polymorphic}
Simon-Olivier
fuente
1
Intenté esto en 4.2, y no estoy seguro de si se trata de un error, zsh u otra cosa, pero la línea de comandos se interpretó como una serie de referencias (como tipos) con cada letra de polimórfico, como: t.referencesp: imagable , treferenceso: imagable, etc.
OzBarry
10
@OzBarry, en zsh necesitarías escapar de las llaves: $ rails genera migración AddImageableToProducts con imagen: referencias \ {polymorphic \}
chad_
44
Para cualquier persona curiosa, esto genera un método de migración con cambio que contiene:add_reference :products, :imageable, polymorphic: true, index: true
stevenspiel
1
En caso de que alguien intente usar lo mismo en el andamio, esto también funciona con el andamio. ¡Gracias! rijks
sghosh968
2
{polymorphic}necesita ser escapado con la concha de pez, por ejemplo\{polymorphic\}
Dorian
36

También puede hacer lo siguiente:

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

Puedes probar rails generate migration AddImageableToProducts imageable:references{polymorphic}

hutusi
fuente
3
{y }necesita ser escapado con la concha de pescado al menos, por ejemplo\{polymorphic\}
Dorian
1
Aquí está el enlace a la documentación sobre esto: edgeguides.rubyonrails.org/…
Giovanni Benussi
Gracias Giovanni, eso es muy útil.
hutusi