문제

사용자 당 하루에 한 번 모델을 저장/업데이트 할 수있는 레일 모델이 있습니다. 사용자와 날짜별로 찾을 수있는 콜백이 있고 오류에 추가하지만 이것은 못 생겼고 레일과 같은 느낌이 듭니다. 전형적인 create_at / updated_at 열이 있습니다 (시간 부분은 중요합니다 / 유지해야합니다).

그래서 나는 내가 할 수 있다고 생각한다 :

1) 생성 날짜와 범위 인 다른 모델 속성을 만듭니다 (BLEH)

2) SCOPE 속성을 사용하지만 어떻게 든 생성 된 _AT의 날짜 부분 만 얻습니다.

3) => proc.new {| o | 내 기존 콜백과 일치하는 파인더} (Gross)

http://ar.rubyonrails.org/classes/activerecord/validations/classmethods.html#m000086

압도적 인 수는 없지만 루비 대신 SQL로 수행되는 것 (명백한 확장 성 이유).

이견있는 사람? 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

자신의 Validate Method를 작성할 수도 있습니다. 이것은 꽤입니다 쉬운. 그리고 사용자 정의 검증 메소드에서 date_trunc (PostgreSQL)을 사용하여 필요한 시간에 기존 레코드를 찾을 수 있습니다. date_trunc도 매개 변수화 될 수 있습니다 (Eghour, Day, Day, Week, Month).

date_trunc 대신 간단한 조건을 사용하여 충돌 레코드를 찾을 수 있습니다. 예를 들어 [ "user_id =? and updated_at> =?", self.user_id, time.now.beginning_of_day] 그리고이 레코드가 인덱스를 사용할 수 있기 때문에 더 빠를 것 같아요.

다른 팁

나는 결국 그것을 사용했다 conditions 옵션 validates_uniqueness_of 그리고 오늘의 기록을 제한하는 람다를 통과시킵니다.

class AttendanceRecord < ActiveRecord::Base
  validates_uniqueness_of :user_id, conditions: { -> { where("DATE(created_at) = ?", Date.today) } }
end
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top