当我尝试根据枚举字段过滤结果时,我在 Rails 应用程序中遇到了 Ransack 搜索问题。尽管实现了看似正确的设置,但当我选择任何交易类型时,搜索不会返回预期结果。这是与搜索功能相关的视图和控制器代码的简化版本:
#型号代码:
enum transaction_type: %i[LedgerBook StaffLedgerBook Transfer ExpenseEntry Order PurchaseSaleDetail Salary SalaryDetail Investment Expense]
#查看代码:
<%= 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>
# 控制器代码:
if 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])
end
在此代码中,我尝试根据枚举字段 transaction_type 过滤付款。但是,搜索结果与所选交易类型不匹配。我已确认
@transaction_type
变量已正确分配,并且 Ransack 参数名称似乎与我的模型中的属性一致。 options_for_select in
视图看起来也正确。有人可以指导我了解可能导致此问题的原因以及如何使用 Rails 中的枚举字段正确实现 Ransack 搜索吗?
你可以做这样的事情。
ransacker :transaction_type, formatter: proc { |v| transaction_types[v] } do |parent|
parent.table[:transaction_type]
end