2009-11-18 21 views
12

我使用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),因爲這個類沒有拿起新列並抱怨它不存在。

我該如何讓它再次查詢表結構?

回答

29

Legislator.reset_column_informationAPI info

+1

是否有一種簡單的方法適用於每個模型,例如:'ActiveRecord :: Base。 reset_column_information'? – Dorian 2015-01-12 11:30:49

+3

是的,'ActiveRecord :: Base.descendants.each(&:reset_column_information)' – Joao 2017-07-29 17:17:45

0

爲obvio171指出,這是相當容易:

你需要創建一個裸露的模型類的前期。

然後在您需要致電MyModel.reset_column_information, 所以列信息被重載所以這是與您剛剛創建(或改變)新表遷移

然後,您可以只使用每個方法創造新的紀錄。

我使用類似:

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

但是如果你的種子數據比一些常數較多, 那麼你或許應該不是你的數據巴里到這樣的遷移。