Rails の enum フィールドでランサック検索が予期した結果を返さない
概要
Rails アプリケーションで enum フィールドに基づいて結果をフィルタリングしようとすると、Ransack 検索で問題が発生します。正しい設定のように見えるものを実装しているにもかかわらず、どのトランザクション タイプを選択しても、検索では期待した結果が返されません。以下は、検索機能に関連するビューとコントローラー コードの簡略版です。
#モデルコード:
enumtransaction_type: %i[LedgerBook StaffLedgerBook Transfer ExpenseEntry Order PurchaseSaleDetail給与SalaryDetail投資経費]
#Views コード:
<%= search_form_for @q, url: payments_path, class: "admin-controls" , method: "get" do |f| %>
<div class="card col-lg-12 shadow mb-3 p-3">
<div class="row mt-3">
<div class="col-lg-3 form-group float-left">
<%=f.select:account_id_in,options_from_collection_for_select(@accounts, "id" , ->(st){"#{st.title} \u{27F6}
#{st.bank_name}"},f.object.account_id_in), {:include_blank => "Select the Account Title"},{:multiple =>
true,:class=>"form-control chosen-select", :data => {:placeholder => "Select the Account Title"} } %>
</div>
<div class="col-lg-2 form-group float-left">
<%= f.search_field :id_eq, class: 'form-control input-sm ' , placeholder: "Enter Id" %>
</div>
<div class="col-lg-2 form-group float-left">
<%= f.select :transaction_type_eq, options_for_select(Payment.transaction_types.map { |key, value|
[key.humanize, value] }, @transaction_type),{:include_blank=> "Select Type"}, { class: "form-control
chosen-select", prompt: 'Select Type' }%>
</div>
<div class="ml-1">
<p>From:</p>
</div>
<div class="col-lg-2 form-group float-left">
<%= f.search_field :created_at_gteq,value: @start_date, class: 'form-control input-sm datepicker'
, 'datepicker'=> true,placeholder: "YYYY-MM-DD" %>
</div>
<div class="ml-1">
<p>To:</p>
</div>
<div class="col-lg-2 form-group float-left">
<%= f.search_field :created_at_lteq,value: @end_date, class: 'form-control input-sm datepicker' , 'datepicker'=>
true ,placeholder: "YYYY-MM-DD"%>
</div>
<div class="col-1 form-group float-left"> <button class="btn btn-primary" name="search_submit" type="submit"
value="Search" style="width:100px;"><i class="fa fa-search"></i></button> </div>
</div>
</div>
コントローラーコード:
params[:q].present? @title = params[:q][:account_title_cont] @start_date = params[:q][:created_at_gteq] @end_date = params[:q][:created_at_lteq] @transaction_type = params[:q][:transaction_type_eq] params[ :q][:created_at_lteq] = params[:q][:created_at_lteq].to_date.end_of_day if params[:q][:created_at_lteq].present? @q = Payment.where(max_credit: nil, max_debit: nil).ransack(params[:q]) else @q = Payment.where(created_at: @start_date.to_date.beginning_of_day..@end_date.to_date.end_of_day, max_credit : nil、max_debit: nil).ransack(params[:q])
終わり
このコードでは、列挙型フィールドtransaction_typeに基づいて支払いをフィルタリングしようとしています。ただし、検索結果は選択したトランザクション タイプと一致しません。 @transaction_type 変数が正しく割り当てられていることを確認し、Ransack パラメーター名がモデルの属性と一致しているようです。ビュー内の options_for_select も正しく見えます。誰かがこの問題の原因と、Rails の enum フィールドを使用して Ransack search を適切に実装する方法についてガイドしていただけますか?
解決策
このようなことができます。
ransacker :transaction_type, formatter: proc { |v| transaction_types[v] } do |parent|
parent.table[:transaction_type]
end