활동 관리자의 검색 조건에 enum 값이 포함되지 않은 문제를 어떻게 처리합니까

활성 관리자의 검색 조건이 enum 값을 반영하지 않는 현상이 나타납니다.

현상 세부 정보


enum 값은 다음과 같습니다.
enum status: { not_started: 0, in_progress: 1, done: 9 }
활성 관리자의 filter 설정은 다음과 같습니다.(enum값의 일본어화 대응 포함)
filter :status, as: :select, collection:Inquiry.statuses_i18n.invert
이 때, 검색 조건에 enum 값의 선택 항목을 표시하지만, 동작이 동작하지 않는 것을 축소하는 현상이 발생합니다.

원인


activeadmin의 검색은ransackgem을 사용하지만,ransack이enum에 잘 대응하지 못하는 이유입니다.
다음과 같이 변경할 때 동작이 정확합니다.
filter :status, as: :select, collection:Inquiry.statuses_i18n.invert.map{ |k, v| [k, Inquiry.statuses[v]]}

원인 상세 정보

filter :status, as: :select, collection:Inquiry.statuses_i18n.invert
상기 필터를 지정할 때 서버에 보내는 매개 변수는 다음과 같습니다.
{"q"=>{"status_eq"=>"in_progress"}, "commit"=>"絞り込む", "order"=>"id_desc"}
따라서, in_prgress에 대응하는 1로 검색하기를 원하지만 실제 SQL을 보면 다음과 같습니다. "status"= 0.
SELECT COUNT(*) FROM (SELECT 1 AS one FROM `inquiries` WHERE `inquiries`.`status` = 0 LIMIT 30 OFFSET 0) subquery_for_count
즉, ransack 측 in_progress → 1의 변환을 기대했지만 enum의 값을 얻지 못했습니다
열에 문자열을 숫자로 지정했기 때문에 0을 지정했습니다.

해결 방법


filter에서 지정한collection: 다음 부분은 컨트롤러에서 두드리면 다음과 같습니다.
>Inquiry.statuses_i18n.invert

{"未着手"=>"not_started", "進行中"=>"in_progress", "完了"=>"done"}
collection에서 키는 내용을 표시하고value는 서버에 보내는 값이기 때문에 산열을 다음과 같은 형식으로 만들 수 있다면ransack에서 정확하게 검색할 수 있습니다.
{"未着手"=>0, "進行中"=>1, "完了"=>9}
따라서,collection을 읽을 수 있는 값이 아래와 같다면,ransack도 읽을 수 있는 값이 될 수 있습니다(array라도,collection도 문제없이 읽는 모양).
Inquiry.statuses_i18n.invert.map{ |key, value| [key, Inquiry.statuses[value]]}
> [["未着手", 0], ["進行中", 1], ["完了", 9]]
참고: Ransack은 Rails의 enum을 지원하지 않는 것 같습니다.
https://www.tom08.net/entry/2016/12/05/121746

좋은 웹페이지 즐겨찾기