76 votes

Mise à jour d'une colonne, de toutes les lignes

J'ai ajouté une nouvelle colonne à mon tableau mais j'ai oublié d'ajouter l'option :default option. Maintenant, je veux remplir cette colonne sur chaque ligne.

Y a-t-il un moyen de le faire en utilisant la console ? Je cherche sur Google depuis une heure mais je ne trouve rien.

Je sais comment le faire pour un seul objet, mais pas pour toutes les lignes d'un modèle.

Foo.find(1).update_attribute(:myattribute, 'value')

139voto

Jimmy Huang Points 1898

Essayez ça :

Foo.update_all(some_column: "bar")

Cela va générer une requête SQL vers la base de données :

UPDATE "foos" SET "some_column" = "bar";

25voto

marflar Points 13293

Puisque vous avez déjà créé le nouveau champ dans une migration précédente, créez une toute nouvelle migration :

rails g migration UpdateFoos

Modifiez la migration :

def self.up    
  say_with_time "Updating foos..." do
    Foo.find(:all).each do |f|
      f.update_attribute :myattribute, 'value'
    end
  end
end

# from command line
Rake db:migrate

Faites-moi savoir si ça marche, ça peut nécessiter quelques ajustements. Voir les rails docs pour plus :

3voto

jiahut Points 21

Vous pouvez faire comme ça :

Foo.update_all(new_column : "bar")

2voto

wiseland Points 195

Bien sûr, vous pouvez utiliser quelque chose comme Foo.update_all(:myattribute => "value") mais il ne modifiera que les données déjà créées. Pour définir la valeur par défaut pour toutes les données "futures", il est préférable de créer une migration séparée comme celle-ci :

rails generate migration AddDefaultValueToFoo

Modifiez la nouvelle migration (par exemple, monattribut a un type de chaîne) comme ceci :

class AddDefaultValueToFoo < ActiveRecord::Migration
  def self.up
    change_column :foos, :myattribute, :string, :default => "value"
    Foo.update_all(:myattribute => "value")
  end
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X