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é


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

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}

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

16

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.