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

时间:2009-06-09 21:17:28

标签: ruby-on-rails 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时,它的subject字段为空并且不说“嘿那里”。迁移期间不会抛出任何错误,update_attribute行返回true,就像它已经工作一样。

此行在控制台中完美运行并具有预期效果:

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

我尝试在第二次迁移中放入update_attribute行。如果我在一个“rake db:migrate”中将它们一直吹到当前,它仍然不起作用。

但这是奇怪的部分。如果我运行两次单独的迁移,请说“rake db:migrate VERSION = 10”只创建列,然后第二次使用“rake db:migrate”更新属性IT WORKS!

到底发生了什么......如何在迁移过程中修改记录?我似乎记得在过去经常这样做。也许它与Rails 2.3.2有所不同?

谢谢! 布赖恩

3 个答案:

答案 0 :(得分:34)

您需要在更改的模型上调用reset_column_information,然后才能使用新列。在add_column和更新:

之间添加此内容
User.reset_column_information

请参阅ActiveRecord::Migration页面上的“更改表格后使用模型”。

答案 1 :(得分: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 

答案 2 :(得分: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