【发布时间】:2016-09-29 08:48:56
【问题描述】:
我在 Ruby on Rails 中创建应用程序,它有许多引擎(用于模块化)。
我希望每个引擎都有不同的数据库。这个怎么配置?
数据库 - MYSQL
【问题讨论】:
标签: mysql ruby-on-rails rails-engines
我在 Ruby on Rails 中创建应用程序,它有许多引擎(用于模块化)。
我希望每个引擎都有不同的数据库。这个怎么配置?
数据库 - MYSQL
【问题讨论】:
标签: mysql ruby-on-rails rails-engines
【讨论】:
一般方法是查看框架源并决定是否可以重用。
我们先来看看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
删除/迁移和其他所需任务的方法相同。
这是一个很好的一般规则 - 知道你的堆栈至少比你的工作低一级。有时阅读基础资料比直接回答更有帮助。
我会在继续我的解决方案时更新这个答案...
【讨论】: