2015-06-09 3 views
0

У меня есть странная проблема. Это мой код переноса:Rails миграции не работает

class SetDefaultToFalse < ActiveRecord::Migration 
    def change 
    MyObject.where('done is ?', nil).each do |a| 
     a.done = false 
     a.save 
    end 
    end 
end 

Если я бегу это на дамп базы данных от давно, со всеми другими, более старых миграций, после того, как это сделано, любой из my_objects не имеют done поле помечено как false. Если все еще есть rake db:rollback и db:migrate, неожиданно, он работает. Зачем? В столбце done добавлено более 5 миграций до этого. Изменение предыдущих миграций не является решением, которое я ищу.

+1

Вы должны посмотреть на это: HTTP: // StackOverflow .com/вопросы/12612969/закатного разные-по-умолчанию, значения-в-рельсы-миграций – TarunJadhwani

+1

@TarunJadhwani, Вы можете оставить свой комментарий в качестве ответа. Решением были те две строки: MyObject.connection.schema_cache.clear! MyObject.reset_column_information –

ответ

1

Я не знаю, почему бы вы сделали, что в миграции, но это может помочь:

MyObject.where('done is ?', nil).update_all(done: false) 
+0

Код в примере был упрощен, чтобы просто показать проблему. Операция, представленная там, должна быть сделана с созданием поля, а опция «по умолчанию» установлена ​​в значение «ложь». –

0

Я предлагаю вам попробовать этот код:

class SetDefaultToFalse < ActiveRecord::Migration 
    def self.up 
    MyObject.where('done is ?', nil).each do |a| 
     a.update_attribute(done: false) 
    end 
    end 
end 
0

сделать поле, добавленное после создания. В db-схеме «done» поле не существует.

Run

грабли БД: мигрировать

Смежные вопросы