Rails 3는 유효성 검사 및 콜백 건너 뛰기
검증 및 콜백이 정의 된 특히 복잡한 모델이 있습니다. 이제 비즈니스 요구 사항은 새 레코드를 추가하려면 유효성 검사 및 콜백을 건너 뛰어야하는 특정 시나리오를 요구합니다. 이를 수행하는 가장 좋은 방법은 무엇입니까?
이것은 Rails 3에서 작동합니다.
Model.skip_callback(:create)
model.save(:validate => false)
Model.set_callback(:create)
다음 과 같이 ActiveRecord :: Persistence # update_column을 사용하십시오 .
Model.update_column(field, value)
목표가 콜백이나 유효성 검사없이 단순히 레코드를 삽입하거나 업데이트하는 것이며 추가 gem에 의존하지 않고, 조건부 검사를 추가하거나, RAW SQL을 사용하거나, 어떤 식 으로든 기존 코드를 푸츠하지 않고 수행하려는 경우 다음과 같이 할 수 있습니다. 기존 db 테이블을 가리키는 "그림자 개체"를 사용할 수 있습니다. 이렇게 :
class ImportedUser < ActiveRecord::Base
# To import users with no validations or callbacks
self.table_name = 'users'
end
이는 모든 버전의 Rails에서 작동하고 스레드로부터 안전하며 기존 코드를 수정하지 않고도 모든 유효성 검사 및 콜백을 완전히 제거합니다. 다음과 같이 새 클래스를 사용하여 객체를 삽입하는 것을 잊지 마십시오.
ImportedUser.new( person_attributes )
내 생각은 다음과 같았습니다 (참고 : 이것은 업데이트, 삭제 및 배열에 추가 해야하는 기타에 대한 콜백을 비활성화합니다).
begin
[:create, :save].each{|a| self.class.skip_callback(a) } # We disable callbacks on save and create
# create new record here without callbacks, tou can also disable validations with
# .save(:validate => false)
ensure
[:create, :save].each{|a| self.class.set_callback(a) } # and we ensure that callbacks are restored
end
콜백을 건너 뛸 수있는 메서드를 모델에 추가하는 것은 어떻습니까?
class Foo < ActiveRecord::Base
after_save :do_stuff
def super_secret_create(attrs)
self.skip_callback(:create)
self.update_attributes(attrs)
self.save(:validate => false)
self.set_callback(:create)
end
end
이와 같은 것을 사용하게된다면 이름의 의미를 피하기 위해 모델 이름 대신 self를 사용하는 것이 좋습니다.
나는 또한 Sven Fuchs에서 멋져 보이는 요점을 발견했습니다 .
나는 adhoc 검증을 건너 뛰기위한 간단한 gem을 썼지 만 아마도 콜백 건너 뛰기를 포함하도록 업데이트 될 수있을 것이다.
https://github.com/npearson72/validation_skipper
can_skip_validation_for
gem을 가져와 콜백을 건너 뛰는 기능을 추가 할 수도 있습니다. 메서드를 호출 할 수도 있습니다.can_skip_validation_and_callbacks_for
다른 모든 것은 동일하게 작동합니다. 도움이 필요하면 알려주세요.
스레드로부터 안전하지 않기 때문에 skip_callback 접근 방식을 사용하지 않는 것이 좋습니다. 그러나 은밀한 저장 보석 은 바로 SQL을 실행하기 때문입니다. 이것은 유효성 검사를 트리거하지 않으므로 직접 호출해야합니다 (예 : my_model.valid?).
다음은 해당 문서의 몇 가지 샘플입니다.
# Update. Returns true on success, false otherwise.
existing_record.sneaky_save
# Insert. Returns true on success, false otherwise.
Model.new.sneaky_save
# Raise exception on failure.
record.sneaky_save!
이 해킹은 마침내 나를 위해 일했습니다 ( _notify_comment_observer_for_after_create
객체에 대한 재정의 된 방법).
if no_after_create_callback
def object._notify_comment_observer_for_after_create; nil; end
end
유효성 검사가 데이터베이스 자체에 기록되면이 중 어느 것도 작동하지 않습니다.
+------------------------------------+--------------------------------------------------+------+-----+--------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------------------------+--------------------------------------------------+------+-----+--------------------+----------------+
| status | enum('Big','Small','Ugly','Stupid','Apologetic') | NO | | Stupid | |
참고 URL : https://stackoverflow.com/questions/7572652/rails-3-skip-validations-and-callbacks
'Development Tip' 카테고리의 다른 글
IE에서 클릭 할 수없는 절대 위치 앵커 태그 (텍스트 없음) (0) | 2020.10.31 |
---|---|
os.listdir ()을 사용하여 숨겨진 파일을 무시하는 방법은 무엇입니까? (0) | 2020.10.31 |
"/", "\"를 사용한 플랫폼 독립적 경로 연결? (0) | 2020.10.31 |
oh-my-zsh는 느리지 만 특정 Git 저장소에서만 (0) | 2020.10.31 |
Bash의 배열에서 고유 한 값을 얻으려면 어떻게해야합니까? (0) | 2020.10.31 |