Tengo las siguientes dos migraciones:
Uno, agregue la columna contextual_page_number a la tabla de transcripts :
class AddContextualPageNumberToTranscripts < ActiveRecord::Migration[5.2] def change add_column :transcripts, :contextual_page_number, :integer, default: 1 end end En segundo lugar, cambiar el valor de la columna agregada anterior contextual_page_number según el valor de otra columna:
class ChangePageOffsetAndContextualPageNumberOfTranscripts < ActiveRecord::Migration[5.2] def up Firm.all.find_in_batches do |group| group.each do |firm| Apartment::Tenant.switch(firm.tenant) do Transcript.where.not(page_offset: 0).each do |transcript| transcript.update( contextual_page_number: ((transcript.page_offset - 1) * -1), page_offset: 1 ) end end end end end def down .. end end Después de ejecutar la migración, obtengo un error de atributo desconocido contextual_page_number .
== 20211108132509 AddContextualPageNumberToTranscripts: migrando ============= -- add_column(:transcripts, :contextual_page_number, :integer, {:default=>1}) -> 0.0095s == 20211108132509 AddContextualPageNumberToTranscripts: migrado (0.0096s) ====
== 20220113095658 ChangePageOffsetAndContextualPageNumberOfTranscripts: ¡migración de carriles anulada! StandardError: se produjo un error, esta y todas las migraciones posteriores se cancelaron:
atributo desconocido 'contextual_page_number' para Transcripción.
Incluso probé reset_column_information , pero no tuve suerte:
Apartment::Tenant.switch(firm.tenant) do Transcript.connection.schema_cache.clear! Transcript.reset_column_information .. endCualquier pista sería de gran ayuda, gracias.
Como se mencionó en una de las respuestas, probé reset_column_information justo después de add_column , pero eso no funcionó. Finalmente, SQL al rescate..
sql_cmd = "UPDATE transcripts SET contextual_page_number = ((page_offset - 1) * -1), page_offset = 1 WHERE page_offset != 0" Transcript.connection.execute(sql_cmd)Necesita dos archivos de migración. Primero, intente ejecutar la migración y verifique schema.rb para las transcripts de la tabla y verifique que la columna contextual_page_number recién agregada se esté agregando o no.
Una vez que esté seguro de que se agregó su nueva columna, vuelva a crear una nueva migración como, por ejemplo: MigrateTransriptsCloningsData , y luego agregue los cambios deseados en el bloque up , luego ejecute db:migrate para actualizar los cambios requeridos.
Mi elección sería agregar una nueva tarea de rake y ejecutarla. como bundle exec rake migrate_transcripts_data:start en lugar de mantener esa lógica en db/migrate/your_new_migration_file, la elección es suya.
reset_column_information debería ser la forma correcta de resolver este tipo de problema si desea utilizar modelos en una migración. Sin embargo, esto no está exento de problemas.
Sospecho que el problema es que lo estás llamando demasiado tarde de alguna manera. Póngalo primero en el método up de la segunda migración o después de add_column en la primera migración.