has_one 模型关联未在关联模型中执行 'one'?

has_one model association not enforcing 'one' in associated model?

我有以下

class User < ApplicationRecord

  has_one :physician

end

class Physician < ApplicationRecord

  belongs_to :user

end

由于一个用户只能有一个医生,令我惊讶的是可以使用同一个用户 ID 创建多个医生记录。

这是为什么?我该如何预防?

Physician 可能不应该关联 user_id:

class User
  belongs_to :physician # has a physician_id column
end

class Physician
  has_many :users # has no mention of user_id in its schema
end

belongs_to 对于 Rails 5 及更高版本默认是必需的。如果用户可以在没有医生的情况下登机并且您需要禁用此功能:

class User
  belongs_to :physician, optional: true 
end 

然后,仅在某些条件后才验证 physician 的存在。

belongs_to 关联不以任何方式保证值是唯一的。它只规定关联存储在 this 模型 table 的外键中,因此只能有一个值。

has_one 实际上也不提供任何保证。它只是指定 this table 在 other table 上被引用。如果另一个 table 上有多个匹配行,它将选择最后一个。

如果你想强制每个 table 的唯一性,你需要验证:

class Physician < ApplicationRecord
  belongs_to :user
  validates_uniqueness_of :user_id
end

以及 actually guarantee uniqueness on the database level 的数据库索引:

class AddUniqueIndexToPhysicians < ActiveRecord::Migration[6.0]
  def change
    add_index :physicians, :user_id, unique: true
  end
end