我在表中添加了新列,但忘记添加:default选项。现在,我想在每一行上填充该列。
有使用控制台的方法吗?我过去一个小时一直在搜索google,但找不到任何内容。
我知道如何针对单个对象而不是针对模型中的所有对象。Foo.find(1).update_attribute(:myattribute,'value')
我在表中添加了新列,但忘记添加:default选项。现在,我想在每一行上填充该列。
有使用控制台的方法吗?我过去一个小时一直在搜索google,但找不到任何内容。
我知道如何针对单个对象而不是针对模型中的所有对象。Foo.find(1).update_attribute(:myattribute,'value')
Answers:
尝试这个:
Foo.update_all(some_column: "bar")
这将生成对数据库的SQL查询:
UPDATE "foos" SET "some_column" = "bar";
ActiveRecord::Relation
,因此可以与where
和链接,例如:Foo.where(old_column_1: nil).update_all(new_column: 'bar')
由于您已经在先前的迁移中创建了新字段,因此请创建全新的迁移:
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文档:
当然,您可以使用像这样的smth 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