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
我有以下
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