使用第二个数据库进行Rails动态迁移

时间:2020-03-08 07:21:53

标签: ruby-on-rails activerecord ruby-on-rails-5 database-migration ruby-on-rails-6

我正在尝试创建一个Rails应用程序,该应用程序可以在给定json模式的情况下在非主数据库数据库中创建数据库表。该应用旨在用作管理辅助数据库的界面。应用程序将永远不会访问动态创建的表,除非可能(很少)更改表。

这是我的设置

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

所以现在我的辅助数据库配置在整个应用程序中都可用。

我有一个名为Topic的模型,该模型接受json类型的属性topic_schema。假定该架构是浅层次的,没有层次结构或嵌套。

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

我必须创建一个名为TableCreator的服务类,该服务类可以采用此json模式并基于该表创建表。因此,每次我使用有效的json Topic创建一个新的topic_schema时,该表都会自动创建。请记住,我的应用程序永远不会从该表读取或写入,很少我可能不得不更改或删除该表。因此,我不需要在schema.rb文件中跟踪这些表

我可以创建一个可以将json模式转换为table migration的服务。我想弄清楚如何在不更改应用程序架构文件的情况下运行到secondary_db的迁移。非常感谢您的帮助:)

1 个答案:

答案 0 :(得分:2)

这里是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

感谢Max的建议