2015-12-22 53 views
9

试图将我所有的共享模型移动到可以包含在我的每个微应用中的引擎。如何将多个模式加载到Rails引擎或应用程序中?

这台发动机应该给我们所有的遗留数据提供了一个模型层,包括:

模型文件被自动修补,没关系。

架构文件被猴子打补丁的使用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:createrake db:schema:load工作,

db.rake补丁仅影响db:schema:dumpdb: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类型的数据库?

什么是底层DROPCREATE DATABASE的Rails命令我试图影响额外schema.rb的?

+0

我用含模型一旦发动机工作。我们只分享模型和迁移,并且工作正常。 '架构。rb'我们为每个应用程序单独保存;引擎没有提供。这是有道理的,因为数据库属于应用程序,而不是引擎。 HTH – Raffael

+0

Thx Raffael!在大多数情况下,您是完全正确的:引擎添加新的模型代码或扩展现有模型,并且让schema.rb存在于应用程序中是有意义的。然而,在我们的例子中,引擎代表了生活在完全不同的数据库中的模型 - 所以我们需要为这些模型有不同的模式文件(对吧?) –

+0

我明白了。我从来没有使用过多个数据库,尽管我一直很好奇如何做到这一点。显然你可以在每个模型级的基础上使用不同的数据库。如果您需要在其他数据库上运行迁移,它也会变得有点棘手;请参阅http://excid3.com/blog/rails-activerecord-multiple-databases-and-migrations/ – Raffael

回答

0

您正在使用SQLite作为您的数据库引擎。希望这是你想要做的。

由于您正在创建SQLite数据库,因此与其他数据库适配器(如MySQLAdpter或Postgress)有所不同。

在MySQL的情况下,必须在建立连接之前创建数据库,方法是使用“CREATE DATABASE ...”SQL命令。所以你必须在建立连接之前创建数据库。

但是在SQLite的情况下,由于数据库驻留在一个文件中,并且一个文件只能包含一个数据库,所以没有独立的步骤来创建数据库。尝试建立与数据库本身的连接将导致创建数据库文件。

因此,使用SQLiteAdapter时,create_database方法将不起作用。您可以简单地从代码中删除该行。

你可以看一下对Rake任务数据库的源代码:创建

https://github.com/rails/rails/blob/f47b4236e089b07cb683ee9b7ff8b06111a0ec10/activerecord/lib/active_record/railties/databases.rake

而且,在SQLiteDatabaseTasks“创建”方法的源代码。正如你所看到的,它只是调用establish_connection方法

https://github.com/rails/rails/blob/f47b4236e089b07cb683ee9b7ff8b06111a0ec10/activerecord/lib/active_record/railties/databases.rake

相关问题