如何为ActiveRecord唯一性验证的作用域添加条件过滤
带作用域且限定检查范围的唯一性验证实现
如果你需要在Rails中实现特定作用域内,仅针对符合条件的记录做字段唯一性验证(比如单个租户下,只检查未删除记录的邮箱唯一性),不要用if选项控制验证是否触发,而是用conditions参数过滤唯一性检查的目标记录。
最终实现代码
validates :email, uniqueness: { scope: :tenant_id, conditions: -> { where(deleted_at: nil) } }
关键区别说明
scope: :tenant_id:限定唯一性检查的作用域为同一个租户,确保不同租户间的邮箱不会互相干扰conditions: -> { where(deleted_at: nil) }:指定唯一性验证仅查询deleted_at为nil的活跃记录,已删除的记录不会被纳入重复判断范围
而if: -> { my_condition }的作用是控制验证是否执行,只有当my_condition为真时才会触发唯一性检查,和需求里“始终执行验证,但只检查特定记录”的场景完全不同。
内容的提问来源于stack exchange,提问作者Nathan Gouy
相关产品推荐
相关产品推荐

