Как изменить данные приложения Rails?
Я видел много разговоров о Миграции ActiveRecord и о том, следует ли их использовать для изменения данных в вашем приложении, некоторые говорят, что да, некоторые говорят "нет". Мой вопрос: если вы не используете Migrations для этого, то что вы используете? Еще один script, который вы пишете?
Я после предложений об альтернативных способах и почему они могут быть лучше, чем просто использовать миграции.
Ответы
Ответ 1
Одна проблема возникает, если вы используете предоставленный
rake db:reset
и
rake db:schema:load
которые используют schema.rb
как основу для настройки вашей базы данных. Таким образом, никакие данные не загружаются, и вы застряли.
В Agile Web Development с Rails, Третье издание, которое вы должны получить (если книга Ruby является книгой "Pickaxe", быть книгой "Гамак", кстати?), если вы еще этого не сделали, DHH говорит:
... миграция arent действительно означала переносить данные о семенах. Они слишком временны в природе, чтобы сделать это надежно. Миграции здесь, чтобы вы одна версия схемы к следующей, не создавать новую схему из scratch - у нас есть файл db/schema.rb для этого.
Итак, как только вы на самом деле получить реальное приложение, люди не будут запускать ваши ранние миграции, когда они устанавливают выражение. Theyll начинаются с любая версия хранится в db/schema.rb и игнорировать все эти предыдущие миграции. Это значит, что любые данные, созданные миграциями никогда не попадайте в базу данных, поэтому вы не можете полагаться на него.
Есть много альтернативные способы иметь больше постоянные данные о семени. Самый простой возможно, просто для создания нового файла в db/seed.rb, который содержит Вызов продукта. настроить. Затем этот файл можно вызвать после rake db: schema: load создает начальная схема.
Ответ 2
много раз, миграции лучше всего подходят и не могут быть заменены отдельным script. Представьте себе следующий сценарий: приложение уже используется с текущими данными; столбец кода содержит код в форме "name-zip_code" (да, я знаю, это уродливо, но это происходит), и вы хотите разбить это на два столбца: "имя" и "zip_code", избавляясь от " code '.
def self.up
add_column :companies, :zip_code, :integer
add_column :companies, :name, :string
Company.reset_column_information
Company.find(:all).each do |company|
name, zip_code = company.code.split('-')
company.update_attributes(:name => name, :zip_code => zip_code)
end
remove_column :companies, :code
end
в этом случае, код кода не может быть удален до передачи данных в столбцы имени и почтового индекса.
Ответ 3
Когда мне нужно изменить некоторые данные в базе данных, я создам задачу Rake, которая выполняет некоторую библиотечную функцию для выполнения этой работы. Таким образом, обработка данных будет повторяемой и, если потребуется, может быть запущена и из миграции.