Rails dynamici c миграция со второй базой данных - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь создать приложение rails, которое может создавать таблицы базы данных в неосновной БД с учетом схемы json. Приложение предназначено для использования в качестве интерфейса для управления вторичной базой данных. Приложение никогда не получит доступ к динамически создаваемым таблицам, за исключением, вероятно (очень редко), изменения таблиц.

Вот мои настройки

config
 |
 |- secondary_db.yml
 |- initializers/secondary_db.rb

Так что теперь моя вторичная конфигурация БД доступна по всему приложению.

У меня есть модель с именем Topic, которая принимает атрибут topic_schema типа json. Предположим, что схема мелкая, без иерархии или вложенности.

topic_schema: {
  "type" => "object",
  "required" => ["a", "b"],
  "properties" => {
    "a" => {"type" => "integer"},
    "b" => {"type" => "string"}
  }
}

Мне нужно создать класс обслуживания с именем TableCreator, который может взять эту схему json и создать таблицу на ее основе. Поэтому каждый раз, когда я создаю новый Topic с действительным json topic_schema, таблица создается автоматически. Помните, что мое приложение никогда не будет читать или писать из этой таблицы, редко мне может понадобиться изменить или удалить эту таблицу. Поэтому мне не нужно отслеживать эти таблицы в моем файле schema.rb

. Я могу создать сервис, который может конвертировать json схему в миграцию таблиц . Я хочу выяснить, как я могу запустить миграцию на мой second_db без изменения файла схемы моего приложения. Большое спасибо за любую помощь:)

1 Ответ

2 голосов
/ 09 марта 2020

Вот класс TableCreator, который достиг того, что я хотел сделать.

    class TableCreator < ActiveRecord::Migration[6.0]

      def create
        with_secondary_db_connection do
          create_table :ts_test_table, id: false do |t|
            t.datetime 'time'
            t.string 'value'
          end
        end
      end

      def with_secondary_db_connection
        primary = ActiveRecord::Base.remove_connection
        ActiveRecord::Base.establish_connection(TIMESCALE_CONFIG)
        yield
      ensure
        ActiveRecord::Base.establish_connection(primary)
      end

    end

Спасибо Макс за предложение

...