Hola Daniel,
El 27 de junio de 2009 10:41, Daniel R.
Troitiño[email protected] escribió:
SQLite). Cada uno hace una llamada diferente a la base de datos, y
sencilla. El SchemaDumper tiene un método table, que es el que invoca
a indexes. Mi idea serÃa de nuevo implementar un método foreign_keys
en el SchemaDumper, y hacer un alias_method_chain (no hay otra forma)
de tables, para invocar a ese método cuando se escriba la tabla (hay
un problema que es que table imprime sus errores en el schema.rb, pero
se los “traga” en Ruby, por lo que puedes llegar a escribir tus
foreign keys y que la tabla no haya sido volcada correctamente al
schema.rb).
Es un poco feo inyectar cosas con alias_method_chain, pero es que creo
que no dejan otra.
Sipi… asà exactamente es como yo lo veo también, pero me parece mucho
lÃo, demasiada intromisión para un asunto que querÃa solucionar de
manera rápida y no muy estable (ya sabes, sin tests ni cosas serias),
meterme en todo este lÃo no me compensa por ahora sobre todo si no
existe la posibilidad de recompensa de que estas modificaciones se
incluyan algún dÃa en Rails ya que tienen la opinión (acertada, si me
preguntan) de no incluir nada en estos módulos que sea tan DB
dependiente como es los foreign_keys (no disponibles en sqlite por
ejemplo).
Al final me decidà por la solución de indicarle a Rails que haga el
dump en formato sql:
Use SQL instead of Active Record’s schema dumper when creating the
test database.
This is necessary if your schema can’t be completely dumped by the
schema dumper,
like if you have constraints or database-specific column types
config.active_record.schema_format = :sql
Que según el comentario parece que está hecho para mÃ.
Pero tampoco cambia mucho las cosas… no es que genere un dump en
formato sql… simplemente no genera ninguno:
desc “Migrate the database through scripts in db/migrate and update
db/schema.rb by invoking db:schema:dump. Target specific version with
VERSION=x. Turn off output with VERBOSE=false.”
task :migrate => :environment do
ActiveRecord::Migration.verbose = ENV[“VERBOSE”] ? ENV[“VERBOSE”]
== “true” : true
ActiveRecord::Migrator.migrate(“db/migrate/”, ENV[“VERSION”] ?
ENV[“VERSION”].to_i : nil)
Rake::Task[“db:schema:dump”].invoke if
ActiveRecord::Base.schema_format == :ruby
end
Pero no ganamos nada porque al invocar a db:test:clone se pasa por el
forro el ‘ActiveRecord::Base.schema_format’ y vuelve a usar el
dump.ruby para generar la db test:
desc "Recreate the test database from the current environment's
database schema"
task :clone => %w(db:schema:dump db:test:load)
Aunque hay una salida:
rake db:test:clone_structure
Esta sà que hace un volcado en modo sql usando el MysqlAdapter (en mi
caso) y lo usa para regenerar la db test…
En fÃn que no veo esto nada claro… se supone que
ActiveRecord::Base.schema_format = :sql está para utilizar sql como
sistema de volcado pero simplemente cuando pones cualquier cosa que no
sea :ruby lo que hace es no hacer volcado… en las migraciones aunque
sà en otras tasks… y usando el modo :ruby aunque le indique :sql…
Suerte.
PD: ¿Enviaste el correo a las 04.32 de la madrugada? Vaya, desde luego
es un problema que no te deja dormir
Más bien era el calor quien no me dejaba dormir, esto simplemente me
mantenÃa entretenido
Gracias Daniel.
f.
–
Fernando Guillén
Desarrollador Web Freelance
http://spainrb.org/fernando-guillen