versiones tutorial rails español ejemplos caracteristicas ruby-on-rails sqlite3 gem rake rails-engines

ruby on rails - tutorial - ¿Cómo cargar múltiples esquemas en un motor o aplicación de Rails?



ruby on rails tutorial español (1)

Está utilizando SQLite como su motor de base de datos. Espero que eso es lo que quieres hacer.

Como está creando una base de datos SQLite, las cosas difieren un poco de otros adaptadores de base de datos como MySQLAdpter o Postgress.

En el caso de MySQL, la base de datos debe crearse antes de establecer una conexión gastando los comandos SQL "CREATE DATABASE ...". Entonces debe crear la base de datos antes de establecer la conexión.

Pero en el caso de SQLite, dado que la base de datos reside en un archivo y un archivo puede contener solo una base de datos, no existe un paso separado para crear una base de datos. Un intento de establecer una conexión con la base de datos hará que se cree el archivo de la base de datos.

Por lo tanto, el método create_database no funcionará cuando se use SQLiteAdapter. Simplemente puede eliminar esa línea de su código.

Puede echar un vistazo al código fuente de la tarea Rake db: create

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

Además, el código fuente para el método ''create'' en SQLiteDatabaseTasks. Como puede ver, simplemente llama al método de establecer conexión

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

Tratando de mover todos mis modelos compartidos a un motor que se puede incluir en cada una de mis aplicaciones micro.

Este motor debería proporcionar una capa modelo para todos nuestros datos heredados, que incluyen:

Los archivos de modelo están siendo parcheados automáticamente, eso está bien.

Los archivos de esquema están siendo parcheados usando el db.rake de Nikolay Strum :

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

Necesitamos rake db:create y rake db:schema:load to work,

Los parches db.rake solo afectan a db:schema:dump y db:test:load_schema (parte de tests_prepare, supongo). Intenté parcharlos en db:schema:load usando:

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

Pero esto me da el error NoMethodError: undefined method ''recreate_database'' for #<ActiveRecord::ConnectionAdapters::SQLite3Adapter:0x007feb6bb43558> . Aparentemente, esto solo funciona en bases de datos tipo Oracle?

¿Cuáles son los comandos de Rails para DROP subyacente y sql CREATE DATABASE que estoy intentando afectar para los schema.rb ''s adicionales?