2015-09-22 5 views
0

У меня есть модель под названием Article. Эта модель имеет атрибут, называемый длительностью, который является строкой. Продолжительность может быть утром, днем, вечером и ночью.Rails новые миграции, не обновляющие старые данные

Например, объект статья выглядит следующим образом:

#<Article id: 1, created_at: "2015-09-22 08:00:08", updated_at: "2015-09-22 08:00:08", duration: "morning"> 

Поскольку продолжительность имеет аналогичные свойства, создать базовый класс под названием продолжительность и наследуемые классы, как утром, днем, вечером и ночью.

В течение длительного времени может быть много статей. Но одна статья может иметь только одну продолжительность. Итак, у меня есть has_many и belongs_to ассоциации:

app/model/duration.rb 
class Duration < ActiveRecord::Base 
    has_many :articles 
end 

app/model/article.rb 
class Article < ActiveRecord::Base 
    belongs_to :duration 
end 

Другие наследственные классы:

app/model/duration/morning.rb 
class Morning < Duration 
end 

и так далее для afternoon.rb, evening.rb и night.rb.

У меня уже есть переход для создания таблицы продолжительности. Чтобы добавить поле type продолжительность, у меня есть миграции под названием add_type_to_duration.rb

AddTypeToDuration < ActiveRecord::Migration 
    def change 
    add_column :durations, :type, :string 
    end 
end 

У меня есть другой файл миграция называется add_duration_ref_to_articles.rb Добавить ссылку

class AddDurationRefToArticles < ActiveRecord::Migration 
    def change 
    add_reference :articles, :duration, index:true 
    end 
end 

У меня есть другая миграция, чтобы создать новые длительности в add_initial_durations. rb

class AddInitialDurations < ActiveRecord::Migration 
    def change 
    Morning.create 
    Afternoon.create 
    Evening.create 
    Night.create 
    end 
end 

Теперь я хочу обновить старые данные для адаптации в соответствии с новым migrat ионов. Итак, я другая миграция называется update_articles_to_have_duration.rb

class UpdateArticlesToHaveDuration < ActiveRecord::Migration 
    def change 
    morning = Duration.find_by_type("Morning") 
    Article.where(duration: "morning").find_each do |article| 
     article.update!(duration_id: morning.id) 
    end 
    end 
end 

Теперь, когда я бегу миграций все статьи, которые имели duration = morning, теперь duration_id = nil. Однако, когда я снова запускаю последнюю миграцию с помощью rake db:migrate:redo step:1, тогда статьи имеют правильную длительность_id. Я думаю, что миграция не работает должным образом. Тем не менее, я не получаю никаких ошибок при их запуске. Может кто-нибудь, пожалуйста, дайте мне знать, что я делаю неправильно здесь?

Спасибо за помощь.

+0

Итак, в целом все работает, не так ли? –

+0

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

+0

просто запустите все миграции, добавив 'duration_id', а затем создайте перенос, чтобы удалить столбец' duration' –

ответ

2

Как вы уже сказали, duration_id правильно настроен при повторной миграции, единственной причиной, по которой он не работает в первый раз, может быть то, что миграции не выполняются последовательно, как вы показали.

Файлы миграции имеют временные метки на них, и они стартуют первыми, когда вы делаете rake db:migrate. См. Временные метки файла миграции, чтобы убедиться, что они заказываются по своему желанию.

❯ rake db:migrate:status                         

database: ~/blog/db/development.sqlite3 

Status Migration ID Migration Name 
-------------------------------------------------- 
    up  20150907015616 Create articles 
    down 20150907031746 Create comments 
    down 20150909034614 Devise create users 

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

❯ bin/rake db:migrate VERSION=20150907015616 VERSION=20150907031746 VERSION=20150909034614 

Вы должны будете повторно -order (лучше удалить и воссоздать) файлы миграции или транспонировать его содержимое, если файлы миграции не соответствуют хронологическому порядку временных меток.

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