문제

나는 다음과 같은 변형을 찾고 있습니다. #save 오류가없는 속성 만 저장하는 메소드.따라서 전체적으로 유효하지 않고 모델을 업데이트 할 수 있으며, 이는 여전히 잘못된 데이터를 데이터베이스에 저장하는 것을 방지합니다.

"유효한 속성"이란 @model_instance.errors.on(:attribute)을 호출할 때 nil을 제공하는 속성을 의미합니다.

누구든지 이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

지금까지 나는 다음을 가지고 있습니다 :

def save_valid_attributes 
 valid? 
 update_atrtibutes attributes.inject({}){|k, v, m| m[k] = v unless errors_on(k.to_sym); m} 
end 

이는 할당 시 처리가 수행되지 않은 경우에 작동합니다. 제 경우에는 처리가 있었습니다.예를 들어 데이터베이스 열 "start_date"가 있고 두 가지 메서드가 정의되어 있습니다.

def nice_start_date=(startdate)
 self.start_date = Chronic.parse(startdate) || startdate
end

def nice_start_date
 self.start_date.to_s
end

이 두 가지 방법을 사용하면 저장하기 전에 Chronic을 사용하여 사용자가 입력한 날짜를 적절하게 구문 분석할 수 있습니다.따라서 이를 수행하는 두 번째 방법은 한 번에 하나의 속성입니다.

def save_valid_attributes(attrib) 
  valid?
  attrib.each{|(k,v)| send("${k}=", v); save; reload)
end

날짜 중 하나가 유효하지 않고 저장되지 않으면 모든 추가 속성이 저장되지 않으므로 매번 모델을 다시 로드해야 합니다.

이를 수행하는 더 좋은 방법이 있습니까?나는 이것이 Rails 세계에서 드문 문제가 아니라고 확신합니다. Google 지식 세계에서는 아무것도 찾을 수 없는 것 같습니다.

도움이 되었습니까?

해결책

많은 어려움을 겪지 않고도 이 일을 통해 얼마나 많은 행운을 얻을 수 있을지 모르겠습니다.

프레임워크가 아무리 DRY 및 OO 및 쉬운 작업을 수행하더라도(이 경우에는 - 많이 =) 원자 커밋이 있는 표준 관계형 데이터베이스 앞에서 실행되고 있다는 것을 기억해야 합니다. 정의 특징.모든 변경 사항이 커밋되거나 전혀 커밋되지 않도록 처음부터 설계되었습니다.

Rails +가 작동하도록 설계된 방식에 100% 반대되는 것으로 이 표준 기능을 효과적으로 활용하게 될 것입니다.이는 (이미 말했듯이) 일관성 없는 데이터로 이어질 가능성이 높습니다.

라고 한 ...그것은 항상 가능합니다.관심 있는 속성을 수동으로 검증한 다음 내장된 메서드를 사용하는 방법을 살펴보겠습니다. object.update_attribute_with_validation_skipping.

행운을 빌어요!

다른 팁

덮어쓰시면 됩니다 #save 이와 같이:

def save
  errors.each do |attr, msg|
    send("#{attr}=", send("#{attr}_was"))
  end
  super
end

그러면 원래 값에 오류가 첨부된 모든 속성이 재설정됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top