我正在尝试通过检查输入的邮政编码是否与我的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);
答案 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。