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 칼럼에 데이터가 존재한다면 삭제된 레코드를 가져오고, 존재하지 않는다면 기존 레코드를 가져옵니다.
'Computer Engineering > ruby on rails' 카테고리의 다른 글
[ruby on rails] js를 통한 partial 조각 렌더링 (0) | 2022.07.15 |
---|---|
[rails] 모델 흐름 상상해보기 (0) | 2022.07.12 |
[ruby on rails] err 422 및 CSRF token authenticity 해결 (0) | 2022.06.24 |
[ruby on rails] 히스킨 클론 코딩 4 - 장바구니 기능 (0) | 2022.06.07 |
[ruby on rails] 히스킨 클론 코딩 3 - vaildation 처리 (0) | 2022.06.07 |