首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带作用域的Rails 3 validates_uniquess_of虚拟字段

带作用域的Rails 3 validates_uniquess_of虚拟字段
EN

Stack Overflow用户
提问于 2012-07-31 09:23:55
回答 1查看 328关注 0票数 0

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

代码语言:javascript
复制
      #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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-31 09:47:44

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

  • 获取作用域的所有条目
  • 对于每个条目,执行fullname方法。
  • 在测试

的唯一性时将每个结果添加到数组中

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

我个人使用使用dob作用域的标准before_save来做这件事

代码语言:javascript
复制
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

添加错误消息(在返回之前):

代码语言:javascript
复制
errors.add(:fullname, 'Your error')

回到控制器中,获取错误:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11731894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档