试图将我所有的共享模型移动到可以包含在我的每个微应用中的引擎。如何将多个模式加载到Rails引擎或应用程序中?
这台发动机应该给我们所有的遗留数据提供了一个模型层,包括:
- 模型文件
- 架构文件
- 迁移(我们下面Pivotal Labs' pattern,这不是问题)
模型文件被自动修补,没关系。
架构文件被猴子打补丁的使用Nikolay Strum's db.rake:
namespace :db do
namespace :schema do
# desc 'Dump additional database schema'
task :dump => [:environment, :load_config] do
filename = "#{Rails.root}/db/foo_schema.rb"
File.open(filename, 'w:utf-8') do |file|
ActiveRecord::Base.establish_connection("foo_#{Rails.env}")
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
end
end
end
namespace :test do
# desc 'Purge and load foo_test schema'
task :load_schema do
# like db:test:purge
abcs = ActiveRecord::Base.configurations
ActiveRecord::Base.connection.recreate_database(abcs['foo_test']['database'], mysql_creation_options(abcs['foo_test']))
# like db:test:load_schema
ActiveRecord::Base.establish_connection('foo_test')
ActiveRecord::Schema.verbose = false
load("#{Rails.root}/db/foo_schema.rb")
end
end
end
我们需要rake db:create
和rake db:schema:load
工作,
的db.rake
补丁仅影响db:schema:dump
和db:test:load_schema
(tests_prepare的一部分,我认为) 。我已经尝试使用它们修补到db:schema:load
:
namespace :db do
# Helpers
def mysql_creation_options(config)
@charset = ENV['CHARSET'] || 'utf8'
@collation = ENV['COLLATION'] || 'utf8_unicode_ci'
{:charset => (config['charset'] || @charset), :collation => (config['collation'] || @collation)}
end
def load_schema(schema_name)
abcs = ActiveRecord::Base.configurations
ActiveRecord::Base.connection.recreate_database(abcs[schema_name+'_test']['database'], mysql_creation_options(abcs[schema_name+'_test']))
# like db:test:load_schema
ActiveRecord::Base.establish_connection(schema_name+'_test')
ActiveRecord::Schema.verbose = false
load("#{Rails.root}/db/#{schema_name}_schema.rb")
end
namespace :schema do
# desc 'Dump additional database schema'
task :dump => [:environment, :load_config] do
dump_schema = -> (schema_name) {
filename = "#{Rails.root}/db/#{schema_name}_schema.rb"
File.open(filename, 'w:utf-8') do |file|
ActiveRecord::Base.establish_connection("#{schema_name}_#{Rails.env}")
ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
end
}
dump_schema.call('kiddom')
dump_schema.call('kiddom_warehouse')
end
# When loading from schema, load these files, too
task :load => [:environment, :load_config] do
load_schema('kiddom')
load_schema('kiddom_warehouse')
end
end
namespace :test do
# desc 'Purge and load foo_test schema'
task :load_schema do
load_schema('kiddom')
load_schema('kiddom_warehouse')
end
end
end
但是,这给我的错误NoMethodError: undefined method 'recreate_database' for #<ActiveRecord::ConnectionAdapters::SQLite3Adapter:0x007feb6bb43558>
。显然,这只适用于Oracle类型的数据库?
什么是底层DROP
和CREATE DATABASE
的Rails命令我试图影响额外schema.rb
的?
我用含模型一旦发动机工作。我们只分享模型和迁移,并且工作正常。 '架构。rb'我们为每个应用程序单独保存;引擎没有提供。这是有道理的,因为数据库属于应用程序,而不是引擎。 HTH – Raffael
Thx Raffael!在大多数情况下,您是完全正确的:引擎添加新的模型代码或扩展现有模型,并且让schema.rb存在于应用程序中是有意义的。然而,在我们的例子中,引擎代表了生活在完全不同的数据库中的模型 - 所以我们需要为这些模型有不同的模式文件(对吧?) –
我明白了。我从来没有使用过多个数据库,尽管我一直很好奇如何做到这一点。显然你可以在每个模型级的基础上使用不同的数据库。如果您需要在其他数据库上运行迁移,它也会变得有点棘手;请参阅http://excid3.com/blog/rails-activerecord-multiple-databases-and-migrations/ – Raffael