我有一个使用ActiveRecord的脚本,它根据从CSV文件读取的值动态创建列名,如下所示:
FasterCSV.foreach('votes.csv', :headers => true) do |row|
column_name = "roll_call_id_#{row['roll_call_id']}"
if !Legislator.columns.map(&:name).include?(column_name)
connection_pool.connection.add_column('legislators', column_name, 'string')
end
end
问题在于,在创建新列之后,我无法执行legislator.update_attribute(column_name, value)
,因为该类没有获取新列并抱怨它不存在。
如何让它再次查询表结构?
答案 0 :(得分:31)
Legislator.reset_column_information
(API info)
答案 1 :(得分:0)
您需要预先创建一个裸模型类。
然后在迁移中你需要调用MyModel.reset_column_information, 这样就可以重新加载列信息,以便与刚刚创建(或更改)的新表一起使用
然后,您可以使用每种方法创建新记录。
我用的是:
data = [[1,'foo'], [2,'bar'],[3,'zip']].map{|a,b| {id:a, txt:b} }
MyModel.create!(data)
但是如果你的种子数据超过几个常数, 那你就不应该把你的数据埋没到像这样的迁移中。