2009-09-30 2 views
0

У меня есть модель Rails, которая должна обеспечивать только сохранение/обновление модели один раз в день на пользователя. У меня есть обратный вызов, чтобы выполнить поиск по пользователю и дате, а затем добавить к ошибкам, но это некрасиво и выглядит неуравновешенным. У меня есть типичные столбцы created_at/updated_at (а часть времени значительна/мне нужно ее сохранить).Rails: проверяет уникальность области по дате

Так что я полагаю, что я мог бы либо:

1) Создайте еще один атрибут модели, которая просто дата создания и объема этой (BLEH)

2) Использование: объем атрибутов, но каким-то образом получить только дата-дата created_at, например validates_uniqueness_of: user,: scope =>: created_at.to_date (не работает, очевидно)

3) Подтвердить, если => Proc.new {| o | Finder, который соответствует мой существующий обратный вызов} (брутто)

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 и передал ему лямбда, который ограничивает записи, проверенные только на сегодня.

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

Не думайте, что вам нужны дополнительные брекеты вокруг условий (но условия сайта не позволят мне его отредактировать) – dtc