Как сделать рельсы db: перенести на несколько осколков, которые не являются подчиненными подчиненными отношениями сразу на рельсах?

У меня есть приложение, которое использует разные базы данных на основе субдомена. По сути, схема будет одинаковой, но данные будут различаться для каждой базы данных. Но когда я выпущу некоторые новые функции, и для этого потребуются некоторые изменения схемы, мне нужно будет запустить команду, которая будет работать во всех базах данных, настроенных в shards.yml.

database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 15
  host: localhost
  port: 5432
  username: postgres
  password:

development:
  <<: *default
  database: app_default
production:
  <<: *default
  database: app_default
  username: <%= ENV['BACKEND_DATABASE_USERNAME'] %>
  password: <%= ENV['BACKEND_DATABASE_PASSWORD'] %>

shards.yml

shared: &shared
  adapter: postgresql
  encoding: unicode
  pool: 15
  host: localhost
  username: postgres
  password: 
  port: 5432

octopus:
  environments:
    - development
    - test
    - production
  development:
    default:
      <<: *shared
      database: app
    first:
      <<: *shared
      database: first
    second:
      <<: *shared
      database: second
    ....
  test:
    test:
      host: postgres
      adapter: postgresql
      database: app_test
  production:
    default:
      <<: *shared
      database: app
    first:
      <<: *shared
      database: first
    second:
      <<: *shared
      database: second
    ....

Я использую Octopus для установки осколка на основе субдомена, который отлично работает. У меня проблемы:

  • Я не могу сделать rails db:reset. Получение ошибки ActiveRecord::StatementInvalid: PG::ObjectInUse: ERROR: cannot drop the currently open database
  • Я не могу выполнить rails db:migrate, который будет мигрировать во все базы данных

Ответ 1

Вы должны добавить using в свои миграции

class CreateComments < ActiveRecord::Migration
  using :first, :second

  def change
    create_table :comments do |t|
      t.belongs_to :page, index: true
      t.text :body

      t.timestamps
    end
  end
end

вышеуказанная миграция будет выполняться как на first, так и на second