更新列,所有行

Mar*_*rov 71 ruby-on-rails

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

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

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

Jim*_*ang 131

试试这个:

Foo.update_all(some_column: "bar")
Run Code Online (Sandbox Code Playgroud)

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

UPDATE "foos" SET "some_column" = "bar"; 
Run Code Online (Sandbox Code Playgroud)

  • 没问题@Petrov,甚至更多,您可以将条件参数传递给此方法.喜欢:Foo.update_all({:new_column =>"bar"},{:old_column_1 => nil}).它将更新"old_column_1"列上具有零值的所有记录. (4认同)
  • 在rails 3和4中,这个方法是`ActiveRecord :: Relation`的成员,因此它可以与`where`和朋友链接,如下所示:`Foo.where(old_column_1:nil).update_all(new_column:'巴")` (2认同)

ste*_*och 25

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

rails g migration UpdateFoos
Run Code Online (Sandbox Code Playgroud)

修改迁移:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 很好的答案.Rails3人,在上面的例子中使用Foo.all而不是Foo.find(:all). (4认同)
  • 虽然你对新的迁移是正确的,但如果你有很多列:每个列都是更新所有列的慢速方法.:update_all将大大加快. (2认同)