【问题标题】:Not sure why i am getting uninitialized constant AddTableDefaults::TableDefault不知道为什么我得到未初始化的常量 AddTableDefaults::TableDefault
【发布时间】:2020-02-24 16:29:09
【问题描述】:

使用

创建迁移

rails 生成迁移 add_table_defaults

class AddTableDefaults < ActiveRecord::Migration
      def up
        create_table :table_defaults do |t|
          t.string :table_name, null: false, uniq: true
          t.jsonb :default_values
        end

        TableDefault.create(
          table_name: 'test',
          default_values: [{name:test}]
        )

      end

      def down
        drop_table :table_defaults
      end
    end

在执行时收到错误提示未初始化常量 AddTableDefaults::TableDefault

rake db:迁移

这是直截了当的,不确定我在哪里做错了,感谢任何帮助。谢谢

【问题讨论】:

  • 你需要在模型名称前面加上::,比如::TableDefault
  • @mr_sudaca 这行不通
  • 你能用--trace运行rake任务并粘贴输出吗?
  • @Kunal 你试过这个建议了吗?您的迁移认为您正在寻找一个名为 AddTableDefaults::TableDefault 的类,通过取消命名空间,您应该可以解决问题。

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

我很确定 @mr_sudaca 的解决方案有效 - 但是如果它确实无效,只需在迁移中定义类:

class AddTableDefaults < ActiveRecord::Migration
  class TableDefault < ActiveRecord::Base; end

  def up
    create_table :table_defaults do |t|
      t.string :table_name, null: false, uniq: true
      t.jsonb :default_values
    end
     TableDefault.create(
      table_name: 'test',
      default_values: [
        {name:test}
      ]
    )
  end

  def down
    drop_table :table_defaults
  end
end

【讨论】:

    【解决方案2】:

    不要将表中的列命名为 table_nameself.table_name 是 ActiveRecord 模型用来跟踪模型读取/写入的表的跟踪的属性,因此是一个非常糟糕的选择。

    【讨论】:

    • 一个更好的问题是为什么您甚至将表定义为带有 json 列的单独表。这就像所有 SQL 反模式的教父。使用 ActiveRecord::Attibutes 或常规数据库默认值和 KISS。
    【解决方案3】:

    问题是模型不可用,我试图将数据输入表中

    【讨论】:

      猜你喜欢
      • 2019-01-10
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多