ActiveRecord :: Migration unitialized常量错误。

时间:2016-05-12 21:23:34

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

免责声明:我不知道红宝石。

我一直在尝试设置这个ruby应用程序。我正在尝试调试为什么我得到一个未初始化的常量错误:

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,看看是否有帮助。由于我不知道红宝石,我觉得它没什么帮助。

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分: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重置有关模型的信息缓存,因为表结构已更改。这样可以防止出现问题,例如尝试访问迁移中添加的新列。