Model.reset_column_information在Rails迁移中不会重新加载列

56

我正在使用Rails 3.2,并有一个包含以下代码的迁移:

add_column :users, :gift_aid, :integer, :default => 2
# reset columns
User.reset_column_information

... code here to load legacy data from sqlite3 database ...

# now create a user with the loaded column data
user = User.create( ...other cols..., 
                    :gift_aid => migrated_gift_aid_column_data,
                    ...other cols... )

运行迁移时出现未知属性:gift_aid的错误。 User.column_names在调用reset_column_information之前和之后都显示相同的列表。

奇怪的是,当我在mysql中手动删除该列并重新运行迁移时,它按预期工作。 从一个空数据库重新开始第一个迁移,它不起作用,因此与运行所有迁移有关,而不是单个迁移。

我的User模型有几个先前的迁移,两者都包括reset_column_information,并且都正常工作。

我真的很困惑 - 有人有任何想法吗?

2个回答

105

我认为这可能与模式缓存相关的某种bug有关... 这样做可能有效:

User.connection.schema_cache.clear!
User.reset_column_information

(适用于Rails 3.2.2)


1
我觉得你可能是对的。实际上,我在两个不同的迁移中都调用了User.reset_column_information两次,而导致失败的是第二次调用。我通过重新组织我的迁移,只调用了一次reset_column_information来解决了这个问题(因为我还没有最终部署网站,所以可以回退没有问题)。这个解决方案看起来也是可行的。如果有机会,我会进行测试。 - Iain
1
我可以确认这个完美地完成了工作。看起来在长时间迁移和对模型的多次更改中,只有第一个reset_column_information生效。清除模式缓存使其正常工作!谢谢 :) - Iain
1
非常感谢!自从Rails文档中明确写了不同的内容以来,这让我感到非常困扰-> http://guides.rubyonrails.org/migrations.html#using-models-in-your-migrations - hrdwdmrbl
Rails 2 有选项吗? - stevenspiel
我在Rails 3.2.22中遇到了同样的问题,并通过这个解决方法进行了修复,谢谢! - Fumisky Wells
在Rails 5.2上对我们很有用。谢谢。 - Joshua Pinter

0

在Rails 6上不需要这个(已在6.0.0beta3上测试过)。

我尝试了使用update!(new_column:...)update_all(new_column:...)两种方法。


1
有人了解Rails5吗? - Toshihiro Yokota
2
这个问题在我的Rails 6上仍然存在。 - ELI7VH
1
是的,它似乎仍然存在。作为原始帖子的作者(那些年前),我在使用Rails 6的新项目中遇到了这个问题。不过,解决方法似乎仍然有效,所以至少还有一点好处。 - Iain
1
@ToshihiroYokota 这对我们来说是一个问题,在Rails 5.2上需要使用接受的答案来解决它:User.connection.schema_cache.clear!User.reset_column_information - Joshua Pinter
而今天在Rails 7中... - Iain

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