2016-12-12 4 views
0

Я добавил две миграции, которые в первом добавлении столбца к модели, а во втором я выполняю функцию, которая хранит значение в столбце, недавно добавленном в некоторые строки ,Изменение столбца миграции, не загруженного в рельсы миграции

Проблема заключается в том, что при запуске rake db: migrate вторая миграция вызывает ошибку, поскольку первая миграция была загружена, но база данных еще не изменилась, поэтому один из подходов состоит в том, чтобы запустить команду дважды (она работает).

Первая миграция:

class AddRegisteredReportToSpecialOfferUse < ActiveRecord::Migration 
    def up 
    add_column :special_offer_uses, :registered_report, :boolean, default: false 
    end 

    def down 
    remove_column :special_offer_uses, :registered_report 
    end 
end 

Вторая миграция:

class CreateReportsFromMigrations < ActiveRecord::Migration 
    def change 
    OneClass.perform 
    end 
end 

OneClass.perform это метод, который делает обновление атрибута ранее

добавил
def perform 
´´´ 
special_offer_uses.update_attribute(:registered_report, true) 
´´´ 
end 

ошибка брошена :

StandardError: An error has occurred, all later migrations canceled: undefined method `registered_report=

Обратите внимание, что метод undefined - это имя атрибута, добавленного ранее.

Интересно, есть ли способ избежать выполнения команды дважды без какой-либо ошибки.

ОБНОВЛЕНИЕ:

Я нашел решение с использованием reset_column_information метод, который вызывает столбцы, которые будут перезагружается при следующем запросе.

Resets all the cached information about columns, which will cause them to be reloaded on the next request.

The most common usage pattern for this method is probably in a migration, when just after creating a table you want to populate it with some default values

Дополнительная информация: link

+0

Вы можете показать сообщение об ошибке? –

+1

У меня никогда не было этой проблемы. я даже делаю это в той же миграции – Fallenhero

+1

Не могли бы вы поместить 2 миграции и сообщение об ошибке – MZaragoza

ответ

0

Почему бы не сделать все это в одной миграции?

class AddRegisteredReportToSpecialOfferUse < ActiveRecord::Migration 
    def up 
    add_column :special_offer_uses, :registered_report, :boolean, default: false 
    OneClass.perform 
    end 

    def down 
    remove_column :special_offer_uses, :registered_report 
    end 
end 
+0

Это возможное решение. Однако я ищу решение своей проблемы. –

+1

Если вы настаиваете на повторной миграции, попробуйте использовать метод 'up' вместо' change'. – luckyruby