Как сделать рельсы 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