2009-11-18 20 views
12

मुझे लगता है कि स्तंभ नाम गतिशील रूप से एक CSV फ़ाइल से पढ़ने के मूल्यों पर आधारित बनाता है ActiveRecord का उपयोग कर एक स्क्रिप्ट है, कुछ इस तरह:पुनः लोड स्तंभ नाम

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_information (API info)

+1

क्या प्रत्येक मॉडल पर लागू करने का एक आसान तरीका है, उदाहरण के लिए: 'ActiveRecord :: Base। reset_column_information'? – Dorian

+3

हां, 'ActiveRecord :: Base.descendants.each (&: reset_column_information) ' – Joao

0

रूप obvio171 ने बताया, यह काफी आसान है:

आप एक नंगे मॉडल वर्ग अग्रिम बनाना होगा।

तो माइग्रेशन आप MyModel.reset_column_information, कॉल करने के लिए इतना है कि स्तंभ जानकारी पुनः लोड कर रहा है ताकि नई तालिका आपने अभी बनाया (या परिवर्तित) के साथ है की जरूरत है

आप तो बस हर विधि का उपयोग कर सकते नए रिकॉर्ड बनाने के लिए।

मैं की तरह कुछ का उपयोग करें:

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

लेकिन अगर अपने बीज डेटा में कुछ स्थिरांक से अधिक है, तो आप शायद अपने डेटा इस तरह एक प्रवास में गाड़ नहीं करना चाहिए।

संबंधित मुद्दे