2012-03-17 3 views
0

레일즈 3 유효성 검사 및/또는 콜백을 사용하여 모델의 하나의 레코드 만 부울 값이 참으로 표시되도록하는 가장 확실한 방법은 무엇입니까? 한 레코드를 현재 활성 모델로 표시하고 싶습니다.레일 유효성 검사를 사용하여 현재 활성화 된 모델 하나에 제한

(나는 다른 옵션이있다 - 하나의 연결을 사용하는 것입니다 알고,하지만 난 모델 기록에 더 직접 저장하는 방법을 알고 궁금 해요.)

답변

3

(대신 당신은 또한 좀 더 명확 코딩이 아마 인?, 존재 사용할 수 있습니다 find_by의) 취소 유효성을 검사 할 수 있습니다

validates_uniqueness_of :boolean_attribute, if: :boolean_attribute 

그냥 모델 클래스에서 삭제하십시오. 그러면 모델에 true로 설정된 boolean_attribute가 하나만 있는지 확인합니다.

boolean_attribute를 한 인스턴스에서 다른 인스턴스로 교환하는 원 자성을 해결해야합니다.

사용중인 데이터베이스에 따라 트랜잭션을 사용하여 해결할 수 있습니다. 데이터베이스가 트랜잭션을 지원하지 않는 경우 데이터 일관성을 보장하는 더 좋은 방법을 찾아야 할 수도 있습니다 (예 : "활성"모델을 가리키는 전용 모델을 사용하고 boolean_attribute을 모두 제거하거나 boolean_attribute을 정수로 바꿀 수 있음) 원자 적으로 증가합니다 (활성 숫자를 나타내는 가장 높은 숫자).

2

콜백 아마 가장 좋은 방법이 될 것입니다. 뭔가 같이 :

before_create :check_boolean 

def check_boolean 
    Model.find_by_boolean_value(true).nil? ? true : false 
end 

check_boolean false를 반환하는 경우, 생성 작업은 당신이 원하는 모든 경우

관련 문제