Обновить столбец, все строки - PullRequest
70 голосов
/ 22 декабря 2010

Я добавил новый столбец в свою таблицу, но забыл добавить опцию: default. Теперь я хочу заполнить этот столбец в каждой строке.

Есть ли способ сделать с помощью консоли? Я искал в Google последний час, но ничего не могу найти.

Я знаю, как сделать это для одного объекта, но не для всех в модели. Foo.find (1) .update_attribute (: myattribute, 'value')

Ответы [ 4 ]

130 голосов
/ 22 декабря 2010

Попробуйте это:

Foo.update_all(some_column: "bar")

Это сгенерирует SQL-запрос к базе данных:

UPDATE "foos" SET "some_column" = "bar"; 
25 голосов
/ 22 декабря 2010

Поскольку вы уже создали новое поле в предыдущей миграции, создайте новую миграцию:

rails g migration UpdateFoos

Измените миграцию:

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

Дайте мне знать, если это работает,это может потребовать несколько корректировок.См рельсы документы для более:

3 голосов
/ 04 июня 2013

вы можете сделать так:

Foo.update_all (new_column: "bar")

2 голосов
/ 28 июня 2013

Конечно, вы можете использовать что-то вроде Foo.update_all(:myattribute => "value"), но оно будет изменять только уже созданные данные.Чтобы установить значение по умолчанию для всех «будущих» данных, это хороший способ создать отдельную миграцию следующим образом:

rails generate migration AddDefaultValueToFoo

Изменить новую миграцию (например, myattribute имеет строковый тип) следующим образом:

class AddDefaultValueToFoo < ActiveRecord::Migration
  def self.up
    change_column :foos, :myattribute, :string, :default => "value"
    Foo.update_all(:myattribute => "value")
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...