FIX: Don't cause exceptions due to rename of `reply_id` column

This syncs the value of the `reply_id` column into the `reply_post_id` column until all servers have been deployed and the post migrations ran.

Follow-up to ab07b945c2
This commit is contained in:
Gerhard Schlager 2020-01-17 18:56:15 +01:00
parent b56ade5043
commit cb54bf4f45
3 changed files with 50 additions and 2 deletions

View File

@ -2,8 +2,6 @@
class RenameReplyIdColumn < ActiveRecord::Migration[6.0]
def up
Migration::ColumnDropper.mark_readonly(:post_replies, :reply_id)
add_column :post_replies, :reply_post_id, :integer
execute <<~SQL

View File

@ -0,0 +1,38 @@
# frozen_string_literal: true
class AddTriggerToSyncPostReplies < ActiveRecord::Migration[6.0]
def up
# we don't want this column to be readonly yet
Migration::ColumnDropper.drop_readonly(:post_replies, :reply_id)
DB.exec <<~SQL
CREATE OR REPLACE FUNCTION post_replies_sync_reply_id()
RETURNS trigger AS $rcr$
BEGIN
NEW.reply_post_id := NEW.reply_id;
RETURN NEW;
END
$rcr$ LANGUAGE plpgsql;
SQL
DB.exec <<~SQL
CREATE TRIGGER post_replies_reply_id_sync
BEFORE INSERT OR UPDATE OF reply_id ON post_replies
FOR EACH ROW
WHEN (NEW.reply_id IS NOT NULL)
EXECUTE PROCEDURE post_replies_sync_reply_id();
SQL
# one more sync because we could be missing some data from the time between the
# "20200116140132_rename_reply_id_column" migration and now
execute <<~SQL
UPDATE post_replies
SET reply_post_id = reply_id
WHERE reply_post_id IS NULL
SQL
end
def down
raise ActiveRecord::IrreversibleMigration
end
end

View File

@ -0,0 +1,12 @@
# frozen_string_literal: true
class MakePostReplyIdColumnReadOnly < ActiveRecord::Migration[6.0]
def up
Migration::ColumnDropper.mark_readonly(:post_replies, :reply_id)
DB.exec("DROP FUNCTION IF EXISTS post_replies_sync_reply_id() CASCADE")
end
def down
raise ActiveRecord::IrreversibleMigration
end
end