Update a column, all rows

Ruby on-Rails

Ruby on-Rails Problem Overview


I added a new column to my table but I forgot to add the :default option. Now I want to populate that column on every single row.

Is there a way to do with using the console? I've been searching google for the past hour but I can't find anything.

I know how to do it for a single object, but not for all rows of a model.

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

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

Try this:

Foo.update_all(some_column: "bar")

This will generate SQL query to database:

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

Solution 2 - Ruby on-Rails

Since you already created the new field in a previous migration, create a brand new migration:

rails g migration UpdateFoos

Modify the 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

Let me know if this works, it might need a few adjustments. See rails docs for more:

Solution 3 - Ruby on-Rails

you can do like this: > Foo.update_all(new_column: "bar")

Solution 4 - Ruby on-Rails

Of course you can use smth like Foo.update_all(:myattribute => "value"), but it'll modify only already created data. To set default value for all "future" data it's a good way to create a separate migration like this:

rails generate migration AddDefaultValueToFoo

Modify new migration (for ex. myattribute has a string type) like this:

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMartin PetrovView Question on Stackoverflow
Solution 1 - Ruby on-RailsJimmy HuangView Answer on Stackoverflow
Solution 2 - Ruby on-RailsstephenmurdochView Answer on Stackoverflow
Solution 3 - Ruby on-RailsjiahutView Answer on Stackoverflow
Solution 4 - Ruby on-RailswiselandView Answer on Stackoverflow