validates_uniqueness_of
通過檢查給定範圍內給定字段的相同值是否已存在記錄來工作。 :scope
可讓您定義唯一性的範圍(顯然);例如,如果我正在創建博客軟件,並且希望每個博客只允許使用一次帖子標題,那麼我可以說validates_uniqueness_of :title, :scope => :blog_id
--如果沒有範圍,我只允許在整個系統中使用一次標題。 :scope
不會讓你做一個複雜的檢查,就像你想要的那樣。
你可能有什麼需要做的是建立自己的驗證函數來檢查該字段的唯一性問題,給定的時間內(代碼放在模型內):
validate :field_must_be_unique_within_six_months
def field_must_be_unique_within_six_months
return if field.blank?
num_duplicates = self.class.count(:conditions => ["field = ? AND created_at < ?", self.field, 6.months.ago])
if num_duplicates > 0
errors.add(:field, :taken)
end
end
的field_must_be_unique_within_six_months
方法與validates_uniqueness_of
的工作方式類似,因爲如果已經有一個具有相同給定字段的記錄,但會添加一個條件以確認日期,它將添加一條錯誤消息。 validate :field_must_be_unique_within_six_months
將在保存記錄時將該方法添加到驗證過程中。
爲了驗證在同一時間多個字段不違反乾的,你可以使用validates_each做類似如下:
validates_each :field1, :field2 do |record, attr, value|
if record.class.exists?(["#{attr.to_s} = ? AND created_at < ?", value, 6.months.ago])
errors.add(attr, :taken)
end
end
在上面塊,record
是記錄被驗證,attr
是屬性(所以field1
,field2
等)和value
是該屬性的值。
我不完全認爲你的is_used_recently會爲給定的字段工作,因爲當創建一個新記錄時,self.created_at <6.months.ago == true,但你可以創建超過6個月的第二條記錄以前用相同的值爲:字段 – 2009-06-08 20:12:41
啊我明白了。我讀錯了問題...我會更新我的答案。 – jonnii 2009-06-08 20:21:18