Rails - 是否有可能找到违反唯一验证的记录

Rails - is it possible to find the record that violates unique validation

以下面为例

class SuperHero < ActiveRecord::Base
  validates :weapon, uniqueness: true
end

所以当我创建

SuperHero.create!(name: "Thor", weapon: "hammer")
SuperHero.create!(name: "Spiderman", weapon: "hammer") => Weapon has already been taken

是否可以使用默认的唯一验证添加错误消息 Weapon has already been taken by Thor?以便用户可以轻松找到当前武器分配给谁?

您将需要实施自己的验证。像这样:

class SuperHero < ActiveRecord::Base
  validates :weapon, uniqueness: true

  before_validation -> {
    existing_super_hero = SuperHero.find_by_weapon self.weapon

    if existing_super_hero && existing_super_hero.id != self.id
      self.errors.add(:base, "Weapon has already been taken by #{existing_super_hero.name}")
      throw :abort
    end
  }
end