2016-05-12 5 views
0

Отказ от ответственности: Я не знаю рубина.ActiveRecord :: Migration unitialized constant error.

Я пытался настроить это рубиновое приложение. Я пытаюсь отлаживать почему я получаю неинициализированную постоянную ошибку:

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

uninitialized constant CreateSyncsTable::Syncs/var/rails/cycs/cycs/db/migrate/20100818122117_create_syncs_table.rb:8:in `up' 

Ниже приводится файл содержимого 20100818122117_create_syncs_table.rb.

class CreateSyncsTable < ActiveRecord::Migration 
    def self.up 
    create_table :syncs do |t| 
     t.timestamps 
     t.integer :remedy_query_low 
     t.integer :remedy_query_high 
    end 
    Sync.create :remedy_query_low => 0, :remedy_query_high => 0 
    end 

    def self.down 
    drop_table :syncs 
    end 
end 

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

Sync.create :remedy_query_low => 0, :remedy_query_high => 0 

И я не понимаю, почему и где «Sync» приходит. Более того, я не знаю, какая константа неинициализирована.

Любая помощь в отладке оценивается. Для записи я использую CentOS 7, Maria DB и ActiveRecord версии 3.2.18.

  1. Я просмотрел API, чтобы узнать, поможет ли это. Поскольку я не знаю рубина, я не нахожу его очень полезным.
+0

'Sync' - это модель, она должна быть объявлена ​​в файле' app/models/sync.rb'. – igwan

+0

@torrho Вы решили свою проблему? –

ответ

0

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

class CreateSyncsTable < ActiveRecord::Migration 
    def self.up 
    create_table :syncs do |t| 
     t.timestamps 
     t.integer :remedy_query_low 
     t.integer :remedy_query_high 
    end 
    Sync.reset_column_information 
    Sync.create :remedy_query_low => 0, :remedy_query_high => 0 
    end 

    def self.down 
    drop_table :syncs 
    end 
end 

Лично я рекомендовал бы извлекать Sync.create :remedy_query_low => 0, :remedy_query_high => 0 заявления в целом, так как я думаю, что Rails миграция лучше всего использовать только миграции для схемы и миграции данных лучше всего поместить в rake задачах (большую причину, почему может быть найдено here).

0

В этом случае Sync ссылается на модель. Вы должны имеют файл в app/models/ под названием sync.rb, что является определением модели для класса Sync. Это соглашение Rails для определения моделей.

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

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

Попробуйте этот код:

class Sync < ActiveRecord::Base 
end 

class CreateSyncsTable < ActiveRecord::Migration 
    def self.up 
    create_table :syncs do |t| 
     t.timestamps 
     t.integer :remedy_query_low 
     t.integer :remedy_query_high 
    end 

    # Reset ActiveRecord cache of Sync details 
    Sync.reset_column_information 

    Sync.create :remedy_query_low => 0, :remedy_query_high => 0 
    end 

    def self.down 
    drop_table :syncs 
    end 
end 

Дополнительный вызов Sync.reset_column_information говорит Rails, чтобы сбросить кэш информации о модели, потому что структура таблицы изменилась. Это предотвратит такие проблемы, как попытка доступа к новым столбцам, добавленным в перенос.

+0

@torrho Это ответ на ваш вопрос? Если это так, нажмите галочку рядом с ответом, чтобы принять его. Галочка станет зеленой. Упреки всегда приветствуются! –

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