更新列,所有行

时间:2010-12-22 19:01:49

标签: ruby-on-rails

我在表格中添加了一个新列,但是我忘了添加:default选项。现在我想在每一行填充该列。

有没有办法使用控制台?我一直在谷歌搜索过去的一小时但我找不到任何东西。

我知道如何为单个对象执行此操作,但对模型中的所有对象都不知道。 Foo.find(1).update_attribute(:myattribute,'value')

4 个答案:

答案 0 :(得分:130)

试试这个:

Foo.update_all(some_column: "bar")

这将生成对数据库的SQL查询:

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

答案 1 :(得分:25)

由于您已在先前的迁移中创建了新字段,因此请创建全新的迁移:

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

如果有效,请告诉我,可能需要进行一些调整。有关更多信息,请参阅rails docs

答案 2 :(得分:3)

你可以这样做:

  

Foo.update_all(new_column:“bar”)

答案 3 :(得分:2)

当然你可以像Foo.update_all(:myattribute => "value")一样使用smth,但它只会修改已创建的数据。要为所有“未来”数据设置默认值,这是创建单独迁移的好方法:

rails generate migration AddDefaultValueToFoo

修改新迁移(例如my.proattribute有一个字符串类型),如下所示:

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