【问题标题】:Rails Engines with multiple databases具有多个数据库的 Rails 引擎
【发布时间】:2016-09-29 08:48:56
【问题描述】:

我在 Ruby on Rails 中创建应用程序,它有许多引擎(用于模块化)。

我希望每个引擎都有不同的数据库。这个怎么配置?

数据库 - MYSQL

【问题讨论】:

    标签: mysql ruby-on-rails rails-engines


    【解决方案1】:

    【讨论】:

    • 我知道这个答案对您来说可能是老生常谈,但最好是重新总结您引用的文章的主要观点。那篇文章可以消失,然后这个答案将毫无意义。
    【解决方案2】:

    一般方法是查看框架源并决定是否可以重用。

    我们先来看看activerecord/lib/active_record/railties/databases.rake (v5.0.7)。例如db:create 是如何实现的。

    我们会看到ActiveRecord::Tasks::DatabaseTasks.create_current

    我们打开ActiveRecord::Tasks::DatabaseTasks看看

        # The possible config values are:
        #
        # * +env+: current environment (like Rails.env).
        # * +database_configuration+: configuration of your databases (as in +config/database.yml+).
        # * +db_dir+: your +db+ directory.
        # * +fixtures_path+: a path to fixtures directory.
        # * +migrations_paths+: a list of paths to directories with migrations.
        # * +seed_loader+: an object which will load seeds, it needs to respond to the +load_seed+ method.
        # * +root+: a path to the root of the application.
        #
        # Example usage of DatabaseTasks outside Rails could look as such:
        #
        #   include ActiveRecord::Tasks
        #   DatabaseTasks.database_configuration = YAML.load_file('my_database_config.yml')
        #   DatabaseTasks.db_dir = 'db'
        #   # other settings...
    

    这样我们就可以得到以下解决方案:

    namespace :your_engine do
      namespace :db do
    
        task :load_config do
          ActiveRecord::Tasks::DatabaseTasks.database_configuration = YAML.load_file("config/database_your_engine.yml")
          ActiveRecord::Tasks::DatabaseTasks.db_dir = "db_your_engine"
          ActiveRecord::Tasks::DatabaseTasks.migrations_paths = [ "components/your_engine/db/migrate" ]
    
          ActiveRecord::Base.configurations = ActiveRecord::Tasks::DatabaseTasks.database_configuration
          ActiveRecord::Migrator.migrations_paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
    
          # You can observe following values to see how settings applied.
          # puts ActiveRecord::Base.configurations
          # puts ActiveRecord::Migrator.migrations_paths
          # puts ActiveRecord::Tasks::DatabaseTasks.database_configuration
          # puts ActiveRecord::Tasks::DatabaseTasks.migrations_paths
        end
    
        desc "Create Your DB"
        task create: :load_config do
          ActiveRecord::Tasks::DatabaseTasks.create_current
        end
      end
    end
    
    

    删除/迁移和其他所需任务的方法相同。

    这是一个很好的一般规则 - 知道你的堆栈至少比你的工作低一级。有时阅读基础资料比直接回答更有帮助。

    我会在继续我的解决方案时更新这个答案...

    【讨论】:

      猜你喜欢
      • 2013-03-23
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 2020-12-16
      • 1970-01-01
      • 2011-08-31
      • 2023-03-24
      相关资源
      最近更新 更多