在ActiveRecord模型类中重新加载列名称

时间:2009-11-18 14:20:59

标签: ruby-on-rails database activerecord scripting schema

我有一个使用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),因为该类没有获取新列并抱怨它不存在。

如何让它再次查询表结构?

2 个答案:

答案 0 :(得分:31)

Legislator.reset_column_informationAPI info

答案 1 :(得分:0)

正如obvio171指出的那样,它很容易:

您需要预先创建一个裸模型类。

然后在迁移中你需要调用MyModel.reset_column_information, 这样就可以重新加载列信息,以便与刚刚创建(或更改)的新表一起使用

然后,您可以使用每种方法创建新记录。

我用的是:

data = [[1,'foo'], [2,'bar'],[3,'zip']].map{|a,b| {id:a, txt:b} }
MyModel.create!(data)

但是如果你的种子数据超过几个常数, 那你就不应该把你的数据埋没到像这样的迁移中。