Есть две проблемы, которые мне понятны справа от ставки.
Как утверждают другие, вы пытаетесь использовать атрибут, который вы добавляете в той же миграции.Безопасная вещь - сбросить информацию о столбце, как объяснено в ответе Луиса Сильвы .
Вторая проблема связана с тем, что вы используетеdef change
, где часть содержимого необратима.Все в методе изменения должно быть обратимым.В противном случае следует использовать def up
и def down
.
Вот два варианта, которые могут решить вашу проблему:
Использование def up
и def down
.
class AddSmartToStudent
def up
add_column :students, :smart, :boolean
Student.reset_column_information
Student
.where(grade: 'A')
.find_each { |student| student.update!(smart: true) }
end
def down
remove_column :students, :smart
end
end
Использование reversible
.
class AddSmartToStudent
def change
add_column :students, :smart, :boolean
reversible do |change|
change.up do
Student.reset_column_information
Student
.where(grade: 'A')
.find_each { |student| student.update!(smart: true) }
end
end
end
end
Если вы нене заботясь о обратных вызовах Rails, валидации и т. д. вы также можете использовать
Student.where(grade: 'A').update_all(smart: true)
в качестве замены
Student.where(grade: 'A').find_each { |student| student.update!(smart: true) }
Это обновляет все записи одним запросом, но не создает экземплярзаписи, то есть обратные вызовы Rails, проверки и т. д. не будут выполняться.Для получения дополнительной информации см update_all
.