Заполнение класса Rails в миграции - PullRequest
4 голосов
/ 08 февраля 2009

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

class CreateUserTypes < ActiveRecord::Migration

def self.up
    create_table :user_types do |t|
      t.column :type, :string
      t.timestamps
    end
  end

  def self.down
    drop_table :user_types
  end

  UserType.create :type => "System administrator"
  UserType.create :type => "Simulation controller"
end

но я получаю эту ошибку:

rake aborted!
An error has occurred, all later migrations canceled:

Could not find table 'user_types'

Я следил за Rails wiki и ожидал, что он будет работать.


Спасибо. Но то, что вы предложили, похоже, не работает. Ну, я не вижу строк.

sqlite> select * from user_types; 
1||2009-02-08 12:00:56|2009-02-08 12:00:56 
2||2009-02-08 12:00:57|2009-02-08 12:00:57 

Ответы [ 5 ]

3 голосов
/ 08 февраля 2009

Это комбинация из двух ответов, которые уже даны, но это должно работать для вас:

class CreateUserRoles < ActiveRecord::Migration
  def self.up
    create_table :user_roles do |t|
      t.string :role
      t.timestamps
    end

    UserRole.create :role => "System administrator"
    UserRole.create :role => "Simulation controller"
  end

  def self.down
    drop_table :user_roles
  end
end

Переименуйте ваш класс UserType в UserRole (вместе со связанными тестовыми классами, предполагая, что вы создали все это с помощью генераторов). Rails использует столбец type для наследования одной таблицы и автоматически заполняет поле именем класса, когда у вас есть модели, производные от базового класса.

1 голос
/ 09 февраля 2009

Немного не по теме, но стоит упомянуть: создание экземпляров данных при переносе считается плохой формой, поскольку "официальным" способом создания баз данных в производственной среде является

rake db:schema:load

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

С помощью Seed_fu вы создаете свои данные в YAML, а затем запускаете

rake db:seed

Когда вы хотите настроить данные.

1 голос
/ 08 февраля 2009

Попробуйте это

class CreateUserTypes < ActiveRecord::Migration

  def self.up
    create_table :user_types do |t|
      t.string :role
      t.timestamps
    end

    UserType.create :role => "System administrator"
    UserType.create :role => "Simulation controller"
  end

  def self.down
    drop_table :user_types
  end

end

Это метод self.up, который запускается по умолчанию при вызове rake db: migrate

Редактировать: имя столбца изменено на «роль», поскольку «тип» зарезервирован для наследования одной таблицы. (См. Комментарии). Приносим извинения Кайлу Буну за то, что он получил очень похожий ответ.

0 голосов
/ 02 марта 2009
  1. Поместите операторы создания внутри self.up
  2. Звоните UserType.reset_column_information после создания таблицы и до заселение это. Модель UserType является загружается перед созданием таблицы, поэтому рельсы собрали информацию о структуре базы данных до таблица будет существовать. Вам нужно сбросить это так Rails будет проверять таблицу атрибуты снова.
  3. Не используйте 'type' в качестве имени атрибута. Используется для ИППП.

    класс CreateUserTypes

    def self.up
      create_table :user_types do |t|
        t.column :role, :string
        t.timestamps
      end
    
      UserType.reset_column_information
    
      UserType.create :role => "System administrator"
      UserType.create :role => "Simulation controller"
    
    end
    
    def self.down
      drop_table :user_types
    end
    

    конец

0 голосов
/ 08 февраля 2009

HermanD ответ должен работать. Я хочу отметить, что вы должны быть осторожны с использованием столбца с именем «type» AFAIK, Rails использует это имя столбца для STI.

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