Active Record Validation Rails 4

时间:2014-04-25 00:51:45

标签: validation activerecord ruby-on-rails-4

我正在尝试通过检查输入的邮政编码是否与我的zip_codes表格中的任何邮政编码相对应,在创建图书商店时验证邮政编码的存在。

在书店模型中,类似于:

validates_presence_of :zip_code, unless: ........

查找此类邮政编码的sql语句是:

select zip_code from book_stores where zip_code not in (select distinct zip_code from zip_codes);

2 个答案:

答案 0 :(得分:2)

您想要定义自己的验证方法:

validate :zip_code_exists

def zip_code_exists
    errors.add(:zip_code, 'is not valid') unless ZipCode.exists?(zip_code: zip_code)
end

这会在模型的zip_code属性上添加错误消息,除非ZipCode模型包含的记录zip_code与提供的zip_code匹配

答案 1 :(得分:0)

我会在这里使用before_save钩子。它的工作方式是,它调用一个函数,只有在函数返回true时才保存记录。例如:

BookStore.rb:

before_save :check_zip_code

def check_zip_code
  connection = ActiveRecord::Base.connection

  zip_codes=connection.execute('select "zip_code" from "book_stores" where "zip_code" not in (select distinct "zip_code" from "zip_codes")').to_a

  if self.zip_code&&(zip_codes.include?(self.zip_code)
    return true
  else
    return false
  end
end

您还可以验证zip_code的存在以简化before_save调用,因为验证发生在调用before_save方法之前。然后你可以假设定义了self.zip_code。