rake db: миграция выполняется все миграции правильно - PullRequest
1 голос
/ 16 ноября 2009

Я довольно новичок в Ruby on Rails.

У меня есть 2 файла миграции, которые были предоставлены. Первый, с префиксом 001, создает таблицу и несколько столбцов для этой таблицы. Следующий файл переноса с префиксом 002 вставляет строки в таблицу, созданную в файле 001.

Запуск миграции (rake db: migrate в командной строке) правильно создает таблицу, но не вставляет какие-либо данные, которые являются проблемой. Код из вставки выглядит следующим образом (за исключением гораздо большего количества операторов Student.create,

class AddStudentData < ActiveRecord::Migration
  def self.up
        ...
   Student.create(:name => "Yhi, Manfredo", :gender => "M")
        ...
  end

  def self.down
    Student.delete_all
  end
end

Насколько я понимаю, ученик - это объект модели, поэтому моя модель ученика выглядит так:

class Student < ActiveRecord::Base
end

Нужно ли явно определять метод создания в Student или это что-то, что дано? (Этот проект был выполнен с использованием эшафот)

Спасибо.

Редактировать 1: Я использовал предложение Дэмиена и позвонил create! вместо create, но получил тот же ответ. Тогда то, что я сделал, чтобы увидеть, достиг ли этот код этого уровня, было так называемо,

Student.create12312313!(:name => "foo", :gender => "M")

, который, очевидно, является недействительным кодом, и миграция не выдает никакой ошибки.

Edit2: Ответ найден. Версия таблицы schema_migrations была установлена ​​на 3, и у меня было только 3 различных файла миграции, поэтому она никогда не запускала ни один из файлов миграции, которые у меня были. Вот почему ничего не обновлялось, а поддельные создания, которые я использовал, никогда не выдавали ошибок. Причина, по которой данные об учениках не были вставлены в первый раз, заключалась в том, что определенная таблица уже была в базе данных, и это вызвало конфликт при первом переносе. Так что я действительно искал не db:migrate, а db:reset Несколько хорошо проведенных часов.

Ответы [ 3 ]

1 голос
/ 16 ноября 2009

Метод create унаследован от ActiveRecord::Base.
Так что нет, вам не нужно это определять.

Одна из причин, по которой ваши данные не могут быть включены, заключается в том, что у вас есть проверки, которые не проходят.
Вы можете легко увидеть ошибку, из-за которой ваши данные не будут включены, используя create! вместо create.
Поэтому, если модель не может быть создана, будет сгенерировано исключение и миграция завершится неудачей.

0 голосов
/ 16 ноября 2009

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

Для более старых версий рельсов будет одна строка с наибольшей выполненной миграцией.

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

0 голосов
/ 16 ноября 2009

Вы можете посмотреть на Data Seeding в рельсах. 2.3.4. И действительно ли ваши рельсовые миграции действительно запускают 001_create_whwhat.rb? или вы просто использовали это в качестве примера? начиная с версии 2.2.2 (iirc) используются метки времени, такие как 10092009 .... create_whwhat.rb

Сколько лет вашей версии рельсов?

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