Как вы меняете данные приложения Rails? - PullRequest
12 голосов
/ 15 апреля 2009

Я видел много разговоров о миграции ActiveRecord и о том, должны ли они использоваться для изменения данных в вашем приложении, некоторые люди говорят «да», другие - «нет». Мой вопрос: если вы не используете миграцию для этого, то что вы используете? Просто еще один сценарий, который вы пишете?

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

Ответы [ 3 ]

14 голосов
/ 15 апреля 2009

Одна проблема возникает, если вы используете предоставленный

rake db:reset

и

rake db:schema:load

задач, которые используют schema.rb в качестве основы для настройки вашей базы данных. Таким образом, данные не загружаются, и вы застряли.

В Agile Web Development с Rails, третье издание , которое вы должны получить (если книга Ruby - это книга "Кирка", это должна быть книга "Гамак", кстати?) DHH говорит:

... миграция на самом деле не предназначена для нести начальные данные. Они слишком временны в природе делать это надежно. Миграции здесь, чтобы вы могли одна версия схемы к другой, не создавать свежую схему из нуля - у нас есть файл db / schema.rb для этого.

Итак, как только вы на самом деле начать работать с реальным приложением, люди не будут работать рано миграции, когда они создали приложение. Они начнут с любая версия хранится в db / schema.rb и игнорировать все эти предыдущие миграции. Это означает, что любые данные, созданные миграциями никогда не попадать в базу данных, поэтому Вы не можете полагаться на это.

Есть много альтернативные способы иметь больше постоянные начальные данные. Самый простой вероятно, просто чтобы создать новый файл в db / seed.rb, который содержит те Product.create звонки, которые сделают настроить. Этот файл может быть вызван после граблей db: schema: load создает исходная схема.

4 голосов
/ 15 апреля 2009

часто миграции подходят лучше всего и не могут быть заменены отдельным скриптом. Представьте себе следующий сценарий: приложение уже используется с живыми данными; столбец кода содержит код в форме «name-zip_code» (да, я знаю, что это некрасиво, но это случается), и вы хотите разделить его на два столбца, «name» и «zip_code», избавляясь от « code 'column.


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

в этом случае столбец кода нельзя удалить до передачи данных в столбцы имени и почтового индекса.

1 голос
/ 15 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...