НЕ МОЖЕТ вставлять данные в базу данных при миграции?

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

Я пробовал следующие вещи:

У меня есть две модели ActiveRecord:

class Car < ActiveRecord::Base
  has_many :users
  ...
end

class User < ActiveRecord::Base
  belongs_to :car
  ...
end

Я создал файл миграции, внутри миграции у меня есть:

 def self.up
    default_car = Car.new({:name => 'default_car'})
    default_car.save() #I got 'false' here

    User.create!(:car_id => default_car.id}) #I got default_car.id is null value

  end

  def self.down
    default_car = Car.find({:name => 'default_car'})
    default_user = User.find({:car_id=>default_car.id})

    default_car.delete
    default_user.delete
  end

Я получил false, когда пытался сохранить default_car в базу данных, а мой default_user имеет null car_id.

Это потому, что при миграции НЕ разрешено хранить данные в базе данных??


person Mellon    schedule 01.04.2011    source источник
comment
есть ли проверки в модели автомобиля?   -  person fl00r    schedule 01.04.2011
comment
небольшая отладка: default_car = Car.new({:name => 'default_car'}); default_car.save(); puts default_car.errors   -  person fl00r    schedule 01.04.2011
comment
Верно! есть несколько подтверждений. Я модифицирую его сейчас. ошибки дает место :)   -  person Mellon    schedule 01.04.2011


Ответы (2)


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

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

person Yule    schedule 01.04.2011
comment
Верно! есть несколько подтверждений. - person Mellon; 01.04.2011
comment
Старое правило заключалось в том, что если вы используете модели при переносе, лучше всего также определить модель при переносе. Это поможет, если вы позже решите изменить или даже удалить модель — копия в миграции все равно будет работать. Но если есть возможность - воспользуйтесь seed.rb. - person Arsen7; 24.05.2011
comment
Проверьте гем seed_fu. Я предпочитаю его гораздо больше, чем обычные семена или приспособления. Кроме того, он может работать в вашем рабочем процессе для ваших тестовых прогонов. У меня есть скрипт, который воссоздает БД и seed_fu перед тем, как я, например, запущу все свои регрессионные тесты. - person Dave Sanders; 16.12.2011

Хорошо, мы выяснили, что были некоторые проблемы с проверкой. Итак, вы хотели бы сейчас, чтобы вы могли пропустить проверки:

default_car = Car.new({:name => 'default_car'})
default_car.save(false)
#=> true
person fl00r    schedule 01.04.2011