2009-02-08 4 views
4

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

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 

ответ

3

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

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» для наследования одной таблицы и автоматически заполняет поле именем класса, когда у вас есть модели, которые производятся из базового класса.

+0

Просто интересно, почему используется 't.string' вместо 't.column'? Это первый раз, когда я видел его в процессе миграции. – alamodey

+0

@alamodey - t.string заменить t.column в rails 2.0. –

1

Попробуйте

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, который запускается по умолчанию при вызове рек дб: мигрировать

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

+0

Следующий вопрос: Что мне нужно сделать так, грабли БД: мигрировать будет обновлять базу данных после внесения изменений в файл кочевок , rake, похоже, не работает так же, как make делает для C. – alamodey

+0

Каждый файл миграции запускается последовательно. Если вы вносите изменения в файл миграции, вам следует откат к этой версии и повторный запуск. В качестве альтернативы вы можете написать дополнительный файл миграции, который внесет изменения, которые вам понадобятся поверх оригинала. – DanSingerman

+0

Это все еще не работает, возможно, потому что (как сказал кто-то в этом потоке) зарезервирован столбец «type». – alamodey

0

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

1

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

rake db:schema:load 

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

С Seed_fu, вы создаете свои светильники данных в YAML, а затем выдать

rake db:seed 

Если вы хотите, чтобы данные настройки.

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

    < класса CreateUserTypes ActiveRecord :: Миграция

    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 
    

    конец

 Смежные вопросы

  • Нет связанных вопросов^_^