Computer Engineering/ruby on rails

[ruby on rails] acts_as_paranoid로 레코드 삭제를 칼럼으로 대체하기

soohey 2022. 6. 27. 12:41

 

ActsAsParanoid 활성화

class Paranoiac < ActiveRecord::Base
  acts_as_paranoid
end

기본적으로 ActsAsParanoid는 레코드 삭제가 datetime의 deleted_at라는 열에 저장되어 있다고 가정합니다.

 

acts_as_paranoid 활성화시 발생할 수 있는 문제점

  • acts_as_paranoid동일한 모델에서 및 ActiveStorage를 사용 하면 SystemStackError 가 발생 합니다.
  • 삭제된 상태의 모델을 직접 생성하거나 삭제된 모델을 업데이트할 수 없습니다.

 

필터링

ActsAsParanoid에 의해 레코드가 삭제되면 데이터베이스에 액세스할 때 검색되지 않습니다.

Paranoiac.all을 해도 삭제된 레코드는 검색되지 않습니다.

이를 해결하기 위해서는 필터링을 통한 두가지 방법이 있습니다.

Paranoiac.only_deleted # 삭제된 레코드만 가져오기
Paranoiac.with_deleted # 모든 레코드(삭제된 것, 삭제되지 않은 것) 가져오기

 

실제로 삭제하기

paranoiac.destroy_fully!
Paranoiac.delete_all!(conditions)

.destroy 도 사용할 수 있지만, 단지 개체를 숨기기만 합니다.

또는 destroy나 delete_all을 두 번 호출하여 레코드를 영구적으로 삭제할 수 있습니다.

레코드가 이미 삭제되어있다면(ActsAsParanoid에 의해 숨겨져있다면) 한번 더 삭제하여 레코드를 제거할 수 있습니다.

 

범위

with_deleted와 only_deleted는 범위입니다. 그러므로 다른 범위를 지정하는 메소드와 자유롭게 사용할 수 있습니다.

예를 들어 아래의 두 코드는 같은 것을 의미합니다.

Paranoiac.pretty.with_deleted
Paranoiac.with_deleted.pretty

 

 

nill 처리

ActsAsParanoid를 사용할 경우, 레코드가 삭제되었을 때 데이터베이스에서 액세스할 때 검색되지 않기 때문에 nill 에러를 뱉을 위험이 생길 수 있습니다.

이를 예방하기 위해서는 nill 처리를 해주어야 합니다.

@paranoid = Paranoid.with_deleted.find(params[:id]).deleted_at.present? 
? Paranoid.with_deleted.find(params[:id]) 
: Paranoid.find(params[:id])

with_deleted로 삭제된 레코드까지 가져온 후 deleted_at 칼럼에 데이터가 존재하는지 확인합니다.

deleted_at 칼럼에 데이터가 존재한다면 삭제된 레코드를 가져오고, 존재하지 않는다면 기존 레코드를 가져옵니다.