2012-02-02 109 views
41

重装列我用Rails 3.2,并有包含代码迁移:Model.reset_column_information不在轨道迁移

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...) 

和运行迁移时,我得到unknown attribute: gift_aidUser.column_names在致电reset_column_information之前和之后显示相同的列表。

奇怪的是,当我手动将列放入mysql并重新运行迁移时,它按预期工作。从第一次迁移开始,再次使用空数据库,并且它不起作用,因此这与运行所有迁移而不是单个迁移有关。

我有几个以前的用户模型迁移,都包括reset_column_information和两个工作正常。

我真的抓我的头就这一个 - 任何人有任何想法

回答

73

我想,这一定是某种相关的模式高速缓存错误的......这可能工作:

User.connection.schema_cache.clear! 
User.reset_column_information 

(for Rails 3.2.2)

+1

我想你可能是对的。我在两次不同的迁移中实际上有两次对'User.reset_column_information'的调用,这是第二次失败。我通过重组我的迁移来修复它,所以我只有一次调用'reset_column_information'(因为我还没有最终部署该网站,所以它没有问题返回)。这个解决方案看起来也可以工作。如果我有机会,我会测试它。 – Iain 2012-03-17 13:32:12

+1

我可以证实这个工作很好。看起来像很长的迁移和对模型的多重更改只有第一个'reset_column_information'起作用。清除模式缓存使其工作得很好!谢谢:) – Iain 2012-03-19 15:34:42

+1

非常感谢!由于Rails文档明确写了一些不同的东西,这导致我恶意破坏 - > http://guides.rubyonrails.org/migrations.html#using-models-in-your-migrations – hrdwdmrbl 2013-05-17 17:34:24