Avo DiscardedRecord
가상 리소스 구축
Rails 애플리케이션에서 소프트 삭제된 데이터를 중앙에서 관리하기 위해 Avo의 ArrayResource
를 기반으로 하는 DiscardedRecord
가상 리소스를 생성합니다. 이 리소스는 특정 ActiveRecord 모델에 묶이지 않고, 애플리케이션 내의 모든 소프트 삭제된 레코드를 한곳에 모아 보여주는 역할을 합니다.
데이터 소스(records
메서드) 구현
DiscardedRecord
리소스의 핵심은 records
메서드입니다. 이 메서드는 다음과 같은 방식으로 소프트 삭제된 데이터를 수집합니다.
* 모델 동적 로딩 및 순회: Rails.application.eager_load!
를 통해 모든 모델이 로드되었는지 확인한 후, ActiveRecord::Base.descendants.each
를 사용하여 Discard::Model
모듈을 포함하는 모든 모델을 순회합니다. 이는 discard
Gem을 사용하여 소프트 삭제 기능이 활성화된 모든 테이블을 자동으로 찾아냅니다.
* unscoped
활용: 각 모델의 default_scope
에 의해 소프트 삭제된 레코드가 필터링되지 않도록 unscoped
블록 내에서 model.discarded
를 호출합니다. 이를 통해 실제 삭제되지 않은 모든 레코드를 조회할 수 있습니다.
* 데이터 통합 및 정렬: 조회된 각 레코드는 고유 ID, 모델 타입, 실제 레코드 객체, 삭제 시각(discarded_at
)을 포함하는 해시 형태로 discarded_records
배열에 추가됩니다. 최종적으로 이 배열은 discarded_at
을 기준으로 최신순으로 정렬되어 반환됩니다.
UI 필드(fields
메서드) 구성
사용자 인터페이스에서는 다음 필드들이 제공됩니다.
* preview
: 레코드의 미리보기를 제공합니다.
* model_type
: 해당 레코드가 속한 모델의 이름을 표시합니다.
* record
: 실제 레코드 객체에 대한 링크를 제공합니다.
* object
: 인덱스 뷰에서는 숨겨지고 미리보기 뷰에서만 표시되는 필드로, 레코드의 전체 JSON 표현을 pre
태그를 사용하여 가독성 높게 출력합니다. 이는 CGI.escapeHTML
과 JSON.pretty_generate
를 사용하여 안전하고 보기 좋게 포맷됩니다.
* discarded_at
: 레코드가 소프트 삭제된 시각을 표시합니다.
액션(actions
메서드) 및 컨트롤
DiscardedRecord
리소스는 소프트 삭제된 레코드를 복원할 수 있는 Avo::Actions::Undiscard
액션을 제공합니다. 이 액션은 전체 리소스 수준(인덱스 컨트롤)과 개별 레코드 수준(행 수준 컨트롤) 모두에서 접근 가능하며, 사용자가 실수로 삭제했거나 복원해야 할 데이터를 쉽게 되돌릴 수 있도록 돕습니다.