2009-09-30 4 views
0

사용자 당 일일 한 번 모델 저장/업데이트 만 허용해야하는 레일스 모델이 있습니다. 나는 콜백을 사용하여 Find by user와 date를 수행 한 다음 오류를 추가한다. 그러나 이것은 추한 것이며 un-rails와 같다. 나는 전형적인 created_at/updated_at 컬럼을 가지고있다 (그리고 시간 부분은 중요하다/나는 그것을 유지할 필요가있다).레일스 : 날짜 별 범위 지정의 고유성 확인

그래서 내가 그림 나는 수 중 하나

1)이 (bleh에 의해 생성 및 범위 단지 날짜)

이 또 다른 모델 속성 만들기)를 사용하여 바로 얻을 어떻게 든 범위 속성 만 created_at의 날짜 부분, 예. validates_uniqueness_of : user, : scope => : created_at.to_date

3) => 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과 함께 기록을 제한하는 람다를 전달했습니다.

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

조건 주위에 여분의 중괄호가 필요하지 않다고 생각합니다 (그러나 사이트 조건으로 인해 편집 할 수 없음). – dtc