From d653bea4d08083201c0f9876962bf62665ef3a9d Mon Sep 17 00:00:00 2001 From: Martin Czuchra Date: Wed, 28 Aug 2013 14:51:30 +0200 Subject: [PATCH] Adds journal creation to migration. --- .../20130823113842_migrate_legacy_journals.rb | 105 ++++++++++++++++-- 1 file changed, 93 insertions(+), 12 deletions(-) diff --git a/db/migrate/20130823113842_migrate_legacy_journals.rb b/db/migrate/20130823113842_migrate_legacy_journals.rb index 2ab8af03a8..7c86750ac6 100644 --- a/db/migrate/20130823113842_migrate_legacy_journals.rb +++ b/db/migrate/20130823113842_migrate_legacy_journals.rb @@ -1,8 +1,101 @@ class MigrateLegacyJournals < ActiveRecord::Migration + class AmbiguousJournalsError < ::StandardError + end + class IncompleteJournalsError < ::StandardError end + def up + check_assumptions + + fetch_legacy_journals.each do |journal| + + # turn id fields into integers. + ["id", "journaled_id", "user_id", "version"].each do |f| + journal[f] = journal[f].to_i + end + + journal["changed_data"] = YAML.load(journal["changed_data"]) + + get_journal journal["journaled_id"], + journal["type"], + journal["version"] + end + + binding.pry + + end + + def down + end + + private + + # gets a journal, and makes sure it has a valid id in the database. + def get_journal(id, type, version) + journal = fetch_journal(id, type, version) + + if journal.size > 1 + + raise AmbiguousJournalsError, <<-MESSAGE.split("\n").map(&:strip!).join(" ") + "\n" + It appears there are ambiguous journals. Please make sure + journals are consistent and that the unique constraing on id, + type and version is met. + MESSAGE + + elsif journal.size == 0 + + execute <<-SQL + INSERT INTO journals(journable_id, journable_type, version, created_at) + VALUES ( + #{quote_value(id)}, + #{quote_value(type)}, + #{quote_value(version)}, + #{quote_value(Time.now)} + ) + SQL + end + + journal || fetch_journal(id, type, version) + end + + # fetches legacy journals. might me empty. + def fetch_legacy_journals + ActiveRecord::Base.connection.select_all <<-SQL + SELECT * + FROM #{quoted_legacy_journals_table_name} AS j + ORDER BY j.journaled_id, j.activity_type, j.version + SQL + end + + # fetches specific journal. might be empty. + def fetch_journal(id, type, version) + ActiveRecord::Base.connection.select_all <<-SQL + SELECT * + FROM #{quoted_journals_table_name} AS j + WHERE j.journable_id = #{quote_value(id)} + AND j.journable_type = #{quote_value(type)} + AND j.version = #{quote_value(version)} + SQL + end + + def quote_value name + ActiveRecord::Base.connection.quote name + end + + def quoted_table_name name + ActiveRecord::Base.connection.quote_table_name name + end + + def quoted_legacy_journals_table_name + @@quoted_legacy_journals_table_name ||= quote_table_name 'legacy_journals' + end + + def quoted_journals_table_name + @@quoted_journals_table_name ||= quote_table_name 'journals' + end + def check_assumptions invalid_journals = ActiveRecord::Base.connection.select_values <<-SQL @@ -36,16 +129,4 @@ class MigrateLegacyJournals < ActiveRecord::Migration end end - def up - check_assumptions - binding.pry - end - - def down - end - - def quoted_legacy_journals_table_name - ActiveRecord::Base.connection.quote_table_name('legacy_journals') - end - end