У меня есть модель под названием 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. Я думаю, что миграция не работает должным образом. Тем не менее, я не получаю никаких ошибок при их запуске. Может кто-нибудь, пожалуйста, дайте мне знать, что я делаю неправильно здесь?
Спасибо за помощь.
Итак, в целом все работает, не так ли? –
Да, все работает, только если я запустил миграцию, чтобы обновить старые статьи еще раз. Это не работает, когда я запускаю миграцию один раз. Однако проблема заключается в том, что я также хочу удалить атрибут «продолжительность» из статьи. –
просто запустите все миграции, добавив 'duration_id', а затем создайте перенос, чтобы удалить столбец' duration' –