为什么这个Rails迁移会给出“没有这样的表”错误?

时间:2020-07-16 17:52:37

标签: ruby-on-rails database-migration rails-migrations

在一个新的Rails 6项目中,我有一个名为object_classes的表,其列名为ClassList_id。从schema.rb:

let cube: [f32; 72] = [
    //positions        //normals         //colors
    -0.5,  0.5, -0.5,  0.0,  1.0,  0.0,  0.0, 0.0, 1.0,
    -0.5, -0.5, -0.5,  0.0,  1.0,  0.0,  0.0, 0.0, 1.0,
     0.5, -0.5, -0.5,  0.0,  1.0,  0.0,  0.0, 0.0, 1.0,
     0.5,  0.5, -0.5,  0.0,  1.0,  0.0,  0.0, 0.0, 1.0,

    -0.5,  0.5,  0.5,  0.0, -1.0,  0.0,  0.0, 0.0, 1.0,
    -0.5, -0.5,  0.5,  0.0, -1.0,  0.0,  0.0, 0.0, 1.0,
     0.5, -0.5,  0.5,  0.0, -1.0,  0.0,  0.0, 0.0, 1.0,
     0.5,  0.5,  0.5,  0.0, -1.0,  0.0,  0.0, 0.0, 1.0,
];

let cube_indices: [i32; 36] = [
    0, 1, 2,
    2, 3, 0,
    4, 5, 6,
    6, 7, 4,
    4, 0, 3,
    3, 7, 4,
    5, 1, 2,
    2, 6, 5,
    0, 1, 5,
    5, 4, 0,
    3, 2, 6,
    6, 7, 3,
];

我已经意识到该列应命名为class_list_id,以符合Rails预期的命名约定。因此,我产生了一个新的迁移:

 create_table "object_classes", force: :cascade do |t|
    t.string "name"
    t.integer "ClassList_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["ClassList_id"], name: "index_object_classes_on_ClassList_id"
  end

但是,当我运行此迁移时,出现以下错误:

class FixColumnName < ActiveRecord::Migration[6.0]
  def change
    rename_column :object_classes, :ClassList_id, :class_list_id
  end
end

我在这里做错了什么?我正在寻找一种专门解决这里出问题的解释,以便将来可以避免这种情况。

2 个答案:

答案 0 :(得分:0)

很难知道故障是Rails还是SQLite,但是问题似乎是我为我的object_classes表定义了一个外键,该外键指向一个不存在的表。通过此迁移,我能够修复外键约束并重命名该列:

class FixColumnName < ActiveRecord::Migration[6.0]
  def change
    remove_foreign_key :object_classes, :ClassLists
    rename_column :object_classes, :ClassList_id, :class_list_id
    add_foreign_key :object_classes, :class_lists
  end
end

答案 1 :(得分:0)

您的语法正常,因此该错误必须是保留名称错误。可能会尝试删除该列并再次创建该列,请注意有关迁移的大写字母,因为它们可能不必要地使您的代码复杂化。试试这个:

rails g migration RemoveClassListIdFromObjectClasses

将创建类似这样的迁移:

def drop 
    remove column :object_classes, :class_lis_id
end 

然后运行

rails g migration AddClassListIdToObjectClasses

迁移应如下所示:

def change
    add_column :object_classes, :class_list_id
end

请记住添加数据类型以及您可能需要的其他任何内容。 在那里,您可以检查它创建的迁移,并可以对其进行更改以添加数据类型或更改列的大小写,然后就可以开始了。

注意:如果可以,请接受答案,谢谢!