활동 관리자의 검색 조건에 enum 값이 포함되지 않은 문제를 어떻게 처리합니까
2324 단어 enumRubyRailsactiveadmin
현상 세부 정보
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
Reference
이 문제에 관하여(활동 관리자의 검색 조건에 enum 값이 포함되지 않은 문제를 어떻게 처리합니까), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kotemino/items/5ebd6a98c3888174e428텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)