这一定是简单的事情,但这让我疯了! 我有一个迁移,我想在之后更新记录
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有所不同?
谢谢! 布赖恩
答案 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