53 lines
2.3 KiB
Ruby
53 lines
2.3 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class MovePostNoticesToJson < ActiveRecord::Migration[6.0]
|
||
|
def up
|
||
|
execute <<~SQL
|
||
|
INSERT INTO post_custom_fields(post_id, name, value, created_at, updated_at)
|
||
|
SELECT
|
||
|
posts.id,
|
||
|
'notice',
|
||
|
CASE
|
||
|
WHEN pcf_type.value = 'custom' THEN json_build_object('type', pcf_type.value, 'raw', pcf_args.value, 'cooked', pcf_args.value)
|
||
|
WHEN pcf_type.value = 'new_user' THEN json_build_object('type', pcf_type.value)
|
||
|
WHEN pcf_type.value = 'returning_user' THEN json_build_object('type', pcf_type.value, 'last_posted_at', pcf_args.value)
|
||
|
END,
|
||
|
pcf_type.created_at created_at,
|
||
|
pcf_type.updated_at updated_at
|
||
|
FROM posts
|
||
|
JOIN post_custom_fields pcf_type ON posts.id = pcf_type.post_id AND pcf_type.name = 'notice_type'
|
||
|
LEFT JOIN post_custom_fields pcf_args ON posts.id = pcf_args.post_id AND pcf_args.name = 'notice_args'
|
||
|
SQL
|
||
|
|
||
|
execute "DELETE FROM post_custom_fields WHERE name = 'notice_type' OR name = 'notice_args'"
|
||
|
|
||
|
add_index :post_custom_fields, :post_id, unique: true, name: "index_post_custom_fields_on_notice", where: "name = 'notice'"
|
||
|
|
||
|
remove_index :post_custom_fields, name: "index_post_custom_fields_on_notice_type"
|
||
|
remove_index :post_custom_fields, name: "index_post_custom_fields_on_notice_args"
|
||
|
end
|
||
|
|
||
|
def down
|
||
|
execute <<~SQL
|
||
|
INSERT INTO post_custom_fields(post_id, name, value, created_at, updated_at)
|
||
|
SELECT post_id, 'notice_type', value::json->>'type', created_at, updated_at
|
||
|
FROM post_custom_fields
|
||
|
WHERE name = 'notice'
|
||
|
SQL
|
||
|
|
||
|
execute <<~SQL
|
||
|
INSERT INTO post_custom_fields(post_id, name, value, created_at, updated_at)
|
||
|
SELECT post_id, 'notice_args', COALESCE(value::json->>'cooked', value::json->>'last_posted_at'), created_at, updated_at
|
||
|
FROM post_custom_fields
|
||
|
WHERE name = 'notice'
|
||
|
SQL
|
||
|
|
||
|
execute "DELETE FROM post_custom_fields WHERE name = 'notice'"
|
||
|
|
||
|
add_index :post_custom_fields, :post_id, unique: true, name: "index_post_custom_fields_on_notice_type", where: "name = 'notice_type'"
|
||
|
add_index :post_custom_fields, :post_id, unique: true, name: "index_post_custom_fields_on_notice_args", where: "name = 'notice_args'"
|
||
|
|
||
|
remove_index :index_post_custom_fields_on_notice
|
||
|
end
|
||
|
end
|