Rails在迁移期间不允许我更改记录

19

这应该是一个简单的问题,但它让我抓狂了!
我有一个迁移(migration),我想在之后更新一条记录。

class SubjectsTextField < ActiveRecord::Migration
  def self.up
    add_column :users, :subjects, :text

    User.find(39).update_attribute :subjects, "hey there"
  end

  def self.down
    remove_column :users, :subjects
  end
end

列被创建了,但当我去检查记录39时,它的subjects字段是空的,没有显示“hey there”。在迁移过程中没有抛出任何错误,而update_attribute行返回true,就像它已经起作用一样。

这行代码在控制台中完美地工作,且具有预期效果:

User.find(39).update_attribute :subjects, "hey there"

我尝试将update_attribute行放在第二个迁移中。如果我在一个 "rake db:migrate" 命令中顺序执行两个迁移,一直到当前版本,它仍然不起作用。

但是这里有奇怪的部分。如果我运行两个单独的迁移,比如先运行 "rake db:migrate VERSION=10" 来创建列,然后再运行第二个迁移 "rake db:migrate" 来更新属性,那么它就能工作!

到底是怎么回事……在迁移过程中如何修改记录?我记得以前经常这样做。也许这和 Rails 2.3.2 有所不同?

谢谢! Brian

3个回答

36

在使用新列之前,您需要在更改的模型上调用reset_column_information。将其添加在add_columnupdate之间:

User.reset_column_information

请查看ActiveRecord::Migration页面上的“更改表后使用模型”部分。


就是这样,谢谢Michael!真不敢相信我以前从未遇到过这个问题...非常感谢。 - Brian Armstrong
我遇到了类似的问题。有人在创建模型时没有使用t.timestamps,但是他们使用了t.datetime :updated_at。所以我想添加:created_at,并将任何现有对象的created_at初始化为updated_at的当前值,但它始终为空。奇怪的是,当我尝试使用Time.now时,它可以正常工作。无论如何,谢谢Michael。你的帖子帮了我很多!这为我解决了问题。 - bratsche
感谢Michael提供API页面的链接:这有助于保持更新,因为在其他页面上我发现#reset_column_information方法已被弃用。 - Attilio
这也帮了我很多,谢谢。只是好奇为什么。当我第一次创建它们时,我的迁移实际上起作用了,然后我决定清除我的数据库,从备份中恢复并重新运行迁移,但它没有起作用。仍然在想为什么第一次可以,现在却不行。但无论如何,这让我开始工作了。 - Jason Stokes
1
兄弟,你现在应该得到的不仅仅是+1 -> +100。这让我疯了几个小时了。 - add

1

这个语法更清晰...尝试使用 change_table

class AddReceiveNewsletterToUsers < ActiveRecord::Migration 
   def self.up 
    change_table :users do |t| 
      add_column :users, :subjects, :text
    end
    User.find(39).update_attribute "subjects", "hey there"
  end  

  def self.down 
   remove_column :users, :receive_newsletter  
  end 
end 

0

如果在您的初始迁移中将这两者结合起来,这样做是否有效?

class SubjectsTextField < ActiveRecord::Migration
  def self.up
    add_column :users, :subjects, :text

    User.find(39).update_attribute "subjects", "hey there"
  end

  def self.down
    remove_column :users, :subjects
  end
end

不,这样用引号是行不通的,谢谢回复! - Brian Armstrong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接