2009-09-30 78 views
0

我有一個Rails模型,應該只允許每個用戶每天保存/更新一次模型。我有一個回調來執行查找按用戶和日期,然後添加到錯誤,但這是醜陋的,感覺不像滑軌。我有典型的created_at/updated_at列(和時間部分是重要的/我需要保持它)。Rails:驗證日期範圍的唯一性

所以我想我既可以:

1)創建,其僅僅是由(的Bleh創作和範圍的日期)

2另一種模式屬性)使用:scope屬性,但不知何故得到公正created_at的日期部分,例如validates_uniqueness_of:user,:scope =>:created_at.to_date(顯然不工作)

3)Validate unless => Proc.new {| o |查找我的現有回調匹配}(毛)

http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000086

不會有這些壓倒性的數字,但我寧願它是在SQL,而不是紅寶石做(出於明顯的可擴展性的原因)。

有什麼想法?有沒有更好的辦法?

回答

1

您也可以編寫自己的驗證方法。這是相當easy。並且在自定義驗證方法中,date_trunc(Postgresql)可用於在所需時間範圍內查找現有記錄。 date_trunc也可以被參數化(例如,小時,星期,星期,月)。

代替date_trunc,可以使用一個簡單的條件來查找衝突記錄。例如 [「user_id =?AND updated_at> =?」,self.user_id,Time.now.beginning_of_day]我猜這個記錄查找應該更快,因爲它可以使用索引。

3

我結束了使用conditions選項validates_uniqueness_of並通過它lambda限制檢查記錄到今天的那些。

class AttendanceRecord < ActiveRecord::Base 
    validates_uniqueness_of :user_id, conditions: { -> { where("DATE(created_at) = ?", Date.today) } } 
end 
+0

不認爲你需要額外的條件(但網站條件不會讓我編輯它) – dtc 2015-08-05 02:43:54