用于创建表并在两个字段上添加唯一索引的 Rails 迁移文件在迁移期间似乎被忽略了

Posted

技术标签:

【中文标题】用于创建表并在两个字段上添加唯一索引的 Rails 迁移文件在迁移期间似乎被忽略了【英文标题】:Rails migration file to create table and add unique index on two fields seems being ignored during migration 【发布时间】:2015-07-04 20:10:32 【问题描述】:

我完全被困在这里了!我想添加一个唯一索引,以便关联表中没有两条记录可以具有相同的 user_id 和 course_id 组合。

我在 Rails 中创建了以下迁移文件:

class CreateSignups < ActiveRecord::Migration
  def change

    create_table :signups do |t|

      t.integer :course_id
      t.integer :user_id

      t.timestamps null: false
    end

    add_index :signups, :course_id
    add_index :signups, :user_id
    add_index :signups, [:course_id, :user_id], unique: true

  end
end

...但是由于某种原因,唯一的“course_id & user_id”没有在 schema.rb 中表示,并且使用 rails 控制台,系统允许我手动创建多个记录,其中 course_id 和 user_id 正是一样。

signups 表由 Signup 模型管理,并具有一个称为“id”的整数主键。 course 和 user 模型和数据库表遵循标准 rails 命名约定。

谁能明白为什么这个迁移中没有理解独特的标准?

提前致谢!

【问题讨论】:

【参考方案1】:

您是否已经运行过一次迁移(以创建表)然后添加索引?您可以通过以下方式进行检查:

bundle exec rails dbconsole
select * from schema_migrations;

如果您的迁移版本已经记录在 schema_migrations 表中,并且执行 rake db:migrate 将不会再次运行它。

要添加索引,您有 2 个选项:

    Rollback CreateSignups 的迁移。这将删除当前表,然后执行 rake db:migrate 将使用索引重新创建表。

    如果您不想在上一步中丢失数据,则必须从 rails dbconsole 显式创建 indexes in mysql

【讨论】:

很好的答案!是的,我曾认为将索引添加到现有迁移文件将有助于控制越来越多的迁移文件。非常感谢您提供快速、清晰且内容丰富的答案。

以上是关于用于创建表并在两个字段上添加唯一索引的 Rails 迁移文件在迁移期间似乎被忽略了的主要内容,如果未能解决你的问题,请参考以下文章

如何创建联结表并添加索引?

如何创建唯一索引

MongoDb在并非所有文档中的字段上创建唯一索引[重复]

如何使用枢轴连接两个表并在一个表中组合两个字段

遍历表并在 js/jquery 中创建一个数组

无法在 Rails 3.2 中使用复合唯一索引将记录添加到连接表