Development Tip

Rails 3는 유효성 검사 및 콜백 건너 뛰기

yourdevel 2020. 10. 31. 10:15
반응형

Rails 3는 유효성 검사 및 콜백 건너 뛰기


검증 및 콜백이 정의 된 특히 복잡한 모델이 있습니다. 이제 비즈니스 요구 사항은 새 레코드를 추가하려면 유효성 검사 및 콜백을 건너 뛰어야하는 특정 시나리오를 요구합니다. 이를 수행하는 가장 좋은 방법은 무엇입니까?


이것은 Rails 3에서 작동합니다.

Model.skip_callback(:create)
model.save(:validate => false)
Model.set_callback(:create)

( API 문서관련 질문 )


다음 과 같이 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_forgem을 가져와 콜백을 건너 뛰는 기능을 추가 할 수도 있습니다. 메서드를 호출 할 수도 있습니다.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

반응형