Rails 6:基于关联Actor模型验证AKA记录的唯一性
解决Rails 6中AKA模型关联依赖的唯一性校验问题
这个问题的核心是要把唯一性校验的作用域从单纯的first_name+last_name扩展到关联的actor上,这样就能区分不同演员的同名AKA了,具体调整如下:
1. 修改模型的唯一性验证规则
原来的验证只限制了姓名组合唯一,完全没考虑所属演员的差异。我们需要把actor_id加入到唯一性校验的作用域中,这样就能确保同一演员下的姓名组合不会重复,而不同演员的同名AKA不受限制:
# app/models/aka.rb validates :first_name, presence: true # 调整唯一性校验的作用域,同时关联last_name和actor_id validates :first_name, uniqueness: { scope: [:last_name, :actor_id], message: "这个曾用名已经属于该演员了" } belongs_to :actor
这里的scope: [:last_name, :actor_id]表示,只有当first_name、last_name和actor_id三者完全相同时,才会触发唯一性验证失败,完美匹配你的需求:
- 演员「John Doe」(
actor_id=1)不能重复存储「Joe Doe」 - 演员「Jon Doe」(
actor_id=2)可以正常存储「Joe Doe」
2. 补充数据库层面的唯一索引(必做!)
Rails的模型验证是应用层的校验,在高并发场景下可能会出现漏洞(比如两个请求同时提交同一演员的相同AKA,应用层校验都通过了,但写入数据库时就会产生重复记录)。所以必须在数据库层面添加唯一索引来兜底:
首先生成迁移文件:
rails generate migration AddUniqueIndexToAkas
然后在生成的迁移文件中添加索引规则:
class AddUniqueIndexToAkas < ActiveRecord::Migration[6.1] def change add_index :akas, [:first_name, :last_name, :actor_id], unique: true end end
最后执行迁移生效:
rails db:migrate
这样数据库会直接拒绝违反唯一性规则的写入请求,从根源上避免数据不一致的问题。
内容的提问来源于stack exchange,提问作者tkhobbes
相关产品推荐
相关产品推荐

