2010-12-22 129 views
59

我向表中添加了一個新列,但我忘記添加:default選項。現在我想在每一行填充該列。更新列,所有行

有沒有辦法使用控制檯?我過去一小時一直在谷歌搜索,但找不到任何東西。

我知道如何做一個單一的對象,但不是所有的模型。 Foo.find(1).update_attribute(:myattribute, '值')

+0

你想爲每一行分配相同的值還是不同? – 2010-12-22 19:06:47

+0

所有的值相同。謝謝 – 2010-12-22 19:08:54

+0

好的,@petrov。你可以試試update_all方法 – 2010-12-22 19:15:27

回答

116

試試這個:

Foo.update_all(some_column: "bar") 

這將生成SQL查詢數據庫:

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

既然你已經創建在先前遷移的新領域中,創建全新遷移:

rails g migration UpdateFoos 

莫迪fy遷移:

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 

讓我知道這是否有效,它可能需要一些調整。見軌docs更多:

3

,你可以這樣做:

Foo.update_all(NEW_COLUMN: 「巴」)

2

當然你可以使用像水木清華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