【问题标题】:Rails migration, references `unique: true` isn't generating `unique: true` in schema causing constancy_fail check to failRails 迁移,引用 `unique: true` 未在模式中生成 `unique: true` 导致 constancy_fail 检查失败
【发布时间】:2018-07-26 09:43:39
【问题描述】:

我有以下迁移

class CreateBooking < ActiveRecord::Migration[5.1]
  def change
    create_table :bookings do |t|
      t.integer :day_period, default: 0
      t.references :service, foreign_key: true, unique: true, dependent: :destroy, index: true
    end
  end
end

它会生成以下架构:

  create_table "bookings", force: :cascade do |t|
    t.integer "day_period", default: 0
    t.bigint "service_id"
    t.index ["service_id"], name: "index_bookings_on_service_id"
  end

当我运行运行 consistency_fail 测试的守卫失败时:

There are calls to has_one that aren't backed by unique indexes.
----------------------------------------------------------------
Model          Table Columns
----------------------------------------------------------------
Service  bookings (service_id)
----------------------------------------------------------------

现在我最初没有unique: true,但我回滚并添加它,仍然是同样的问题,再次,没有index: true,所以我回滚并添加它仍然是同样的问题。

我认为这是因为架构中的service_id 上没有unique: true,但我不知道,也找不到关于我的具体问题的任何信息。

考虑到当前的迁移,是什么导致了这个问题,我在做什么导致这个问题以及我可以做些什么来阻止这个问题?

【问题讨论】:

  • 你在互联网上的什么地方读到你可以像t.references unique: true这样传递这个参数?唯一性是索引的属性,而不是引用本身。例如,您可以t.add_index 那样传递参数:api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/…
  • @TomLord 老实说,我不知道,而且我的 rails-fu 还没有那么出色。

标签: ruby activerecord rails-migrations ruby-on-rails-5.1


【解决方案1】:
t.references :service, foreign_key: true, dependent: :destroy, index: {unique: true}

更多关于creating references

【讨论】:

  • 这行得通,所以谢谢,问题,将来是否有可能使我可以将其从 has_one 更改为 has_many 如果需要?
  • 可以更改,但不能创建多个分配对象:evoke ActiveRecord::RecordNotUnique
  • @Thermatix 如果您认为它应该是has_many,那么我会尽快做出改变。将大型应用程序更新为到处使用booking.services 而不是booking.service 可能会很痛苦;影响是不小的。
猜你喜欢
  • 2019-05-30
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
相关资源
最近更新 更多