2014-04-25 146 views
1

我想通過檢查輸入的郵政編碼是否對應於我的zip_codes表中的任何郵政編碼,來創建書店時驗證是否存在郵政編碼。Active Record Validation Rails 4

在書店的模式,是這樣的:

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

你要定義自己的驗證方法:

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相匹配。

+0

謝謝!工作很好。我改變的唯一的事情是寫作:無效而不是'無效',顯示相同的錯誤信息。 – uralika

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已定義。