我在创建新的Client对象时创建了一个回调,而不是使用validates_uniqueness_of
验证方法,因为:
我的问题:有没有比我的解决方案更优雅的方式实现这一目标?
我有以下模型:
class Client < ActiveRecord::Base
before_validation_on_create :prevent_duplicate_clients
private
def prevent_duplicate_clients
client = self.class.find(:all, :conditions => ["first_name = ? AND middle_name = ? AND last_name = ? AND date_of_birth = ?", self.first_name, self.middle_name, self.last_name, self.date_of_birth])
if client.size >= 1
self.errors.add(:base, "Client exists as #{client.first.name}")
false
end
end
end
NB:
答案 0 :(得分:2)
如果您想采用自定义验证器路径:
class Client < ActiveRecord::Base
validate :client_uniqueness
protected
def client_uniqueness
duplicates = self.class.all(:conditions => {
:first_name => first_name,
:middle_name => middle_name,
:last_name => last_name,
:date_of_birth => date_of_birth
})
if duplicates.present?
errors.add_to_base "Client exists as #{duplicates.map(&:name).to_sentence}"
end
end
end
答案 1 :(得分:1)
没有理由在验证中无法做到这一点。通过validate
类方法(Doc)。
如果您想要更清洁的型号,或者在多个型号中使用它,可以使用自定义验证器轻微干燥。
你可以有这样的东西
class Client < ActiveRecord::Base
validates_uniq_with_custom_message :first_name, :middle_name, :dob #etc
end
这是关于主题的好blog
答案 2 :(得分:1)
您不应将验证代码放在before_validation回调中。将before_validation_on_create :prevent_duplicate_clients
更改为validate :prevent_duplicate_clients
答案 3 :(得分:0)
我认为你走在正确的轨道上 - 我的问题是你是应该添加错误还是只是将细节添加到现有客户端。