【问题标题】:ActiveRecord::Migration unitialized constant error.ActiveRecord::Migration 未初始化常量错误。
【发布时间】:2016-05-12 21:23:33
【问题描述】:

免责声明:我不知道 ruby​​。

我一直在尝试设置这个 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

我也不明白“同步”的来源或来源。此外,我不知道未初始化的常量是什么。

感谢您对此进行调试的任何帮助。作为记录,我使用的是 centOS 7、Maria DB 和 ActiveRecord 版本 3.2.18。

  1. 我查看了API,看看是否有帮助。由于我不了解 ruby​​,因此我觉得它没有多大帮助。

【问题讨论】:

  • Sync是一个模型,应该在app/models/sync.rb文件中声明。
  • @torrho 你的问题解决了吗?

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


【解决方案1】:

尝试添加对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 =&gt; 0, :remedy_query_high =&gt; 0 语句,因为我认为 Rails 迁移最好只用于 schema 迁移,而数据迁移最好放在 rake 任务中(这是一个很好的理由为什么可以找到here)。

【讨论】:

    【解决方案2】:

    在这种情况下,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 重置有关模型的信息缓存,因为表结构已更改。这将防止出现问题,例如尝试访问迁移中添加的新列。

    【讨论】:

    • @torrho 这回答了你的问题吗?如果是这样,请单击答案旁边的复选标记以接受它。复选标记将变为绿色。也欢迎大家点赞!
    猜你喜欢
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多