यह सब मान रहा है कि कॉलम के डेटाटाइप में किसी भी मौजूदा डेटा के लिए एक अंतर्निहित रूपांतरण है। मैंने कई स्थितियों में भाग लिया है जहाँ मौजूदा डेटा, String
मान लें कि इसे नए डेटाटाइप में बदला जा सकता है, आइए बताते हैं Date
।
इस स्थिति में, यह जानना उपयोगी है कि आप डेटा रूपांतरण के साथ माइग्रेशन बना सकते हैं। व्यक्तिगत रूप से, मैं इन्हें अपनी मॉडल फ़ाइल में रखना पसंद करता हूं, और फिर सभी डेटाबेस स्कीमाओं के माइग्रेट होने और स्थिर होने के बाद उन्हें हटा देता हूं।
/app/models/table.rb
...
def string_to_date
update(new_date_field: date_field.to_date)
end
def date_to_string
update(old_date_field: date_field.to_s)
end
...
def up
# Add column to store converted data
add_column :table_name, :new_date_field, :date
# Update the all resources
Table.all.each(&:string_to_date)
# Remove old column
remove_column :table_name, :date_field
# Rename new column
rename_column :table_name, :new_date_field, :date_field
end
# Reversed steps does allow for migration rollback
def down
add_column :table_name, :old_date_field, :string
Table.all.each(&:date_to_string)
remove_column :table_name, :date_field
rename_column :table_name, :old_date_field, :date_field
end