Skip to content

Instantly share code, notes, and snippets.

@mahm mahm/ruby_migration.mkd Secret
Created Jun 28, 2013

Embed
What would you like to do?
Ruby 1.9.2 -> 1.9.3への移行時におけるserializeカラムの移行方法を検討します。

Ruby 1.9.2 -> 1.9.3への移行時におけるserializeカラムの移行方法を検討

1 別カラムを作成する

1.1 rubyのバージョンを変更

1.9.2 -> 1.9.3

1.2 migration作成

AddVdataToTables

class AddVdataToTables < ActiveRecord::Migration
  def change
    add_column :tables, :vdata, :text, limit: (2**32 - 1)
  end
end

1.3 serialize指定の変更

class Table < ActiveRecord::Base
  # serialize :data
  serialize :vdata
end

1.4 migrationスクリプトの実行

migration.rb

ActiveRecord::Base.transaction do
  %w(Table).each do |class_name|
    Object.const_get(class_name).all.each do |record|
      record.vdata = Syck::load(record.data)
      record.save!
    end
  end
end

2 カラム変えずに移行

2.1 rubyのバージョンを変更

1.9.2 -> 1.9.3

2.2 migrationスクリプトの実行

migration.rb

ActiveRecord::Base.transaction do
  %w(Table).each do |class_name|
    Object.const_get(class_name).all.each do |record|
      # 内部的にPsyck::dumpで保存される
      record.data = Syck::load(record.attributes_before_type_cast["data"][:value])
      record.save!
    end
  end
end

3 YAMLエンジンを変えずに移行

3.1 rubyのバージョンを変更

1.9.2 -> 1.9.3

3.2 application.rbに以下の設定を追加

YAML::ENGINE.yamler = "syck"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.