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

121

J'ai une table Produits et je souhaite 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'essaye de le mettre manuellement après avoir généré la migration, je l'ai fait comme ceci:

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é

chemin de fer
la source
Pas de réponse, mais pour éviter toute confusion, êtes-vous sûr de vouloir cette colonne sur les produits? Le guide des rails a même un exemple de produits et la colonne est sur Pictures guides.rubyonrails.org
...

Réponses:

109

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 cette réponse 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
la source
Merci beaucoup Brandon. J'ai pu exécuter la migration. Je me demandais cependant, après avoir créé: polymorphic => true et que vous ouvrez schema.rb, êtes-vous censé le voir également dans le schéma?
railslearner
Après avoir exécuté la migration, schema.rbdevrait être mis à jour, mais cela ne dira rien polymorphic. Au lieu de cela, vous devriez voir les champs réels utilisés par Rails (les guides Rails ont plus d'informations).
Michelle Tilley le
2
Comment ajoutez-vous un index à la referencescolonne? Dois-je l'indexer?
mrudult
@mrudult Si je ne me trompe pas, vous devez les ajouter vous-même si vous en avez besoin. Vous pouvez simplement ajouter des index comme d'habitude dans le fichier de migration vers imageable_typeet / ou imageable_idsi nécessaire.
Michelle Tilley
2
Ouaip. ajout d'index imageable_idet imageable_typetravaillé. Merci de votre aide.
mrudult
266

Ce que vous essayez de faire n'est pas encore implémenté dans la version stable des rails, la réponse de Michelle est donc la bonne pour le moment. Mais cette fonctionnalité sera implémentée dans les rails 4 et est déjà disponible dans la version bord comme suit (selon ce CHANGELOG ):

$ rails generate migration AddImageableToProducts imageable:references{polymorphic}
simon-olivier
la source
1
J'ai essayé cela sur 4.2, et je ne suis pas sûr s'il s'agit d'un bogue, zsh ou autre chose, mais la ligne de commande a été interprétée comme une série de références (en tant que types) avec chaque lettre de polymorphe, comme: t.referencesp: imagable , treferenceso: imagable, etc.
OzBarry
10
@OzBarry, dans zsh, vous auriez besoin d'échapper aux accolades: $ rails générer la migration AddImageableToProducts imageable: references \ {polymorphic \}
chad_
4
Pour toute personne curieuse, cela génère une méthode de migration avec changement contenant:add_reference :products, :imageable, polymorphic: true, index: true
stevenspiel
1
Incase quiconque essaie d'utiliser la même chose dans un échafaudage, cela fonctionne également avec l'échafaudage. Merci! rijks
sghosh968
2
{polymorphic}doit être échappé avec la coquille de poisson, par exemple\{polymorphic\}
Dorian
36

Vous pouvez également effectuer les opérations suivantes:

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

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

hutusi
la source
3
{et }doivent être échappés avec la coquille de poisson au moins, par exemple\{polymorphic\}
Dorian
1
Voici le lien vers la documentation à ce sujet: edgeguides.rubyonrails.org
Giovanni Benussi
Merci Giovanni, c'est très utile.
hutusi