【问题标题】:Removing a database unique index constraint in postgres Rails在 postgres Rails 中删除数据库唯一索引约束
【发布时间】:2016-12-19 00:05:52
【问题描述】:

在我的 Rails structure.sql 中,我有这行代码:

CREATE UNIQUE INDEX primary_active_fruit_in_season_constraint ON trees USING btree (user_id) WHERE (is_ripe AND is_in_season);

我不再需要此验证,因此我将删除 Tree 模型上 Rails 代码中的验证。但是如何删除这个数据库验证?它从哪里来的? rails 迁移中的哪一行代码创建了这个?如何删除它?

【问题讨论】:

    标签: ruby-on-rails postgresql rails-migrations


    【解决方案1】:

    我们无法知道是谁创建了该索引,但它附带的 WHERE 子句表明(因为 AR 通常不知道这些高级事物)它是手动创建的,例如:

    connection.execute('create unique index ...')
    

    您可以以相同的方式在迁移中删除索引:

    def up
      connection.execute('drop index primary_active_fruit_in_season')
    end
    def down
      connection.execute('CREATE UNIQUE INDEX primary_active_fruit_in_season_constraint ON trees USING btree (user_id) WHERE (is_ripe AND is_in_season)')
    end
    

    像往常一样手动创建包含这两种方法和rake db:migrate 的迁移文件。

    【讨论】:

    • 啊,我明白了……我必须在这里使用connection.execute。所以这是一个具有唯一性的数据库级索引对吗?这不是基于代码的唯一性验证吗?
    • structure.sql 中的所有内容都在数据库中。唯一约束和唯一索引或多或少是一回事。索引上的 WHERE 子句是 ActiveRecord 无法理解的,这可能是您使用 structure.sql 而不是 schema.rb 的原因。
    猜你喜欢
    • 2014-06-25
    • 2016-08-10
    • 2016-11-19
    • 2020-01-05
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多