0

我正在开发一个 Rails 3 应用程序,该应用程序需要在虚拟字段上运行验证以查看记录是否已经存在......这是我的模型代码:

      #mass-assignment
      attr_accessible :first_name, :last_name, :dob, :gender

      #validations
      validates_presence_of :first_name, :last_name, :gender, :dob
      validates :fullname, :uniqueness => { :scope => [:dob] }

def fullname
    "#{first_name} #{last_name}"
  end

我没有收到任何错误,它通过了验证。

4

1 回答 1

1

我不认为你可以用标准做这样的事情validates。原因是,它通常是一个“简单”的 sql 查找唯一性。但是要检查从您的方法返回的内容的唯一性,它必须:

  • 获取范围的所有条目
  • 对于每个,执行fullname方法。
  • 在测试唯一性时将每个结果添加到数组中

当数据集很小时很简单,但是一旦您的范围内达到 10K 以上的匹配项,就需要很长时间才能完成。

我个人会使用dob范围使用标准 before_save 来执行此操作

before_save :check_full_name_uniqueness

def check_full_name_uniqueness
  query_id = id || 0
  return !Patient.where("first_name = ? and last_name = ? and dob = ? and id != ?", first_name, last_name, dob, query_id).exists?
end

添加错误信息(返回前):

errors.add(:fullname, 'Your error')

回到控制器,得到错误:

your_object.errors.each do |k, v| #k is the key of the hash, here fullname, and v the error message
  #Do whatever you have to do
end
于 2012-07-31T01:47:44.483 回答