2012-06-26 49 views
2

我需要驗證表格的會員卡號碼是唯一的唯一當前年份,所以我必須爲我的模型列創建一個自定義驗證器。可以創建一個應該運行查詢來驗證的自定義驗證器嗎?

我的問題是:

  • 重進行查詢,以當年檢查唯一我每次更新/創建一個單行?我如何期待 與此?
  • 我只在CakePHP上使用自定義的驗證器,你能發佈一個愚蠢的例子,只爲我展示一個語法示例嗎?

編輯1:

注意,本年度被存儲在一個名爲expire_date列這是一個年 - 月 - 日日期格式。 但是,應該只在一年中執行檢查。 我該如何處理這個問題?這就是爲什麼我想我應該使用自定義驗證器,我認爲scope不應該在這種情況下工作。

編輯2:

我只注意到一個:if的選擇,我會檢查,如果我可以通過它實現這一點。

回答

3

的Rails 3提供了語法糖,這樣你就可以做這樣的事情:

validates :car_number, :uniqueness => {:scope => :expire_year, :message => 'has already been taken this year'}, :on => :update 

def expire_year 
    expire_date.strftime("%Y") 
end 

查詢重如何依賴於數據庫架構和負載。不要忘記在年份欄中設置索引並檢查導軌日誌。

請注意,這僅適用於更新,因爲新對象在保存之前沒有填充時間戳。

+0

其實我認爲索引應該是[:card_number,:year]。但是最好測試它並查看唯一性查詢中是否使用了很多列 –

+0

是的,單列索引是隱含的主鍵,因此SQL EXPLAIN可以顯示索引最適合的區域 – Anatoly

+0

mh我有一個「問題「,我的」年份「存儲在一個名爲」expire_date「的列中,其中包含完整日期,我該如何處理? –

2

ActiveRecord已經有了!

validates_uniqueness_of :car_number, :scope => :year 

Google文檔validates_uniqueness_of