web-dev-qa-db-fra.com

comment générer une migration pour rendre les références polymorphes

J'ai une table de produits et je veux ajouter une colonne:

t.references :imageable, :polymorphic => true

J'essayais de générer une migration pour cela en faisant:

$ Rails generate migration AddImageableToProducts imageable:references:polymorphic

mais je le fais évidemment mal. Quelqu'un peut-il faire une suggestion? Merci

Lorsque j'essaie de l'insérer manuellement après avoir généré la migration, je l'ai fait comme suit:

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

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

et ça n'a toujours pas marché

113
railslearner

Autant que je sache, il n'y a pas de générateur intégré pour les associations polymorphes. Générez une migration vierge puis modifiez-la manuellement en fonction de vos besoins.

Mise à jour : Vous devrez spécifier la table que vous modifiez. Selon this SO answer :

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
105
Michelle Tilley

Ce que vous essayez de faire n’est pas encore implémenté dans la version stable de Rails; la réponse de Brandon est donc la bonne pour le moment. Mais cette fonctionnalité sera implémentée dans Rails 4 et est déjà disponible dans la version Edge comme suit (selon ceci CHANGELOG ):

$ Rails generate migration AddImageableToProducts imageable:references{polymorphic}
252
simon-olivier

Vous pouvez également faire ce qui suit:

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

Tu peux essayer Rails generate migration AddImageableToProducts imageable:references{polymorphic}

16
hutusi