mirror of
https://github.com/discourse/discourse.git
synced 2024-12-05 09:43:53 +08:00
9428a669b5
Since disable_ddl_transaction! is disabled for this migration, it needs to be idempotent. Any error during the migration (e.g. a timeout) will cause ActiveRecord to fail the migration, and try again on the next run. If the index had already been created during the first run, then an 'already exists' error will be raised, with no way to recover. Unfortunately an [ActiveRecord bug](https://github.com/rails/rails/pull/41490) prevents us from using `if_not_exists: true` alongside `algorithm: :concurrently`, so we have to drop to raw SQL.
24 lines
615 B
Ruby
24 lines
615 B
Ruby
# frozen_string_literal: true
|
|
|
|
class AddPartialIndexPinnedUntil < ActiveRecord::Migration[6.1]
|
|
disable_ddl_transaction!
|
|
|
|
# Dropping to raw SQL here due to an ActiveRecord bug which prevents
|
|
# using `algorithm: :concurrently` and `if_not_exists: true`
|
|
# https://github.com/rails/rails/pull/41490
|
|
|
|
def up
|
|
execute <<~SQL
|
|
CREATE INDEX CONCURRENTLY IF NOT EXISTS "index_topics_on_pinned_until"
|
|
ON "topics" ("pinned_until")
|
|
WHERE pinned_until IS NOT NULL
|
|
SQL
|
|
end
|
|
|
|
def down
|
|
execute <<~SQL
|
|
DROP INDEX CONCURRENTLY IF EXISTS "index_topics_on_pinned_until"
|
|
SQL
|
|
end
|
|
end
|