Ransack return 具有布尔属性的记录,包括 true 和 false 以及复选框

Ransack return records with boolean attribute both true and false with checkbox

我正在使用 Ransack 在名为 Car 的模型上创建搜索表单。我在 Car 上有几个布尔属性,我在搜索表单中为每个属性都包含了复选框,例如:

<%= f.check_box :car_spec_anti_lock_brakes_true %>
<%= f.label :car_spec_anti_lock_brakes_true, "ABS" %>

选中此复选框后,搜索结果将包含 car_spec_anti_lock_brakestrue 的所有记录。未选中时,结果仅 return 记录其中 car_spec_anti_lock_brakesfalse。我如何实现搜索表单,以便在未选中复选框时,car_spec_anti_lock_brakes 为真或假的所有记录都被 returned。因此,当复选框被选中时 return 所有具有该属性的记录,但当它未被选中时 return 所有记录,与属性是真还是假无关。

我通过编辑传递给 Car.search 方法的 params 散列解决了这个问题。如果未选中该复选框,我会从散列中删除参数。所以如果我有以下复选框:

<%= f.check_box :car_spec_anti_lock_brakes_true %>
<%= f.label :car_spec_anti_lock_brakes_true, "ABS" %>

<%= f.check_box :car_spec_traction_control_true %>
<%= f.label :car_spec_traction_control_true, "Traction control" %>

<%= f.check_box :car_spec_rims_true %>
<%= f.label :car_spec_rims_true, "Rims" %>

params[:q] 散列将具有键 :car_spec_anti_lock_brakes_true:car_spec_traction_control_true:car_spec_rims_true。当一个复选框未被选中时,相应的键在被传递到搜索时将在 params[:q] 散列中具有 0 的值。解决方案是在 params[:q] 散列中删除具有 0 值的键,然后再将它们传递到搜索中:

if params[:q]
    @params = params[:q]
    @params.delete(:car_spec_anti_lock_brakes_true) if @params[:car_spec_anti_lock_brakes_true] = '0'
    @params.delete(:car_spec_traction_control_true) if @params[:car_spec_traction_control_true] = '0'
    @params.delete(:car_spec_anti_rims_true) if @params[:car_spec_rims_true] = '0'
else
    @params = []
end

@search = Car.search(@params)
@cars = @search.result

我通过编辑视图文件解决了。

您的代码生成提供虚假参数的隐藏表单。

<%= f.check_box :car_spec_anti_lock_brakes_true %>

#generated html code
<input type="hidden" value="0" name="q[car_spec_anti_lock_brakes_true]"></input>
<input id="q_car_spec_anti_lock_brakes_true" type="checkbox" value="1" name="q[car_spec_anti_lock_brakes_true]"></input>

所以,我删除了隐藏表格。

<%= f.check_box :car_spec_anti_lock_brakes_true, include_hidden: false %>

#generated html code
<input id="q_car_spec_anti_lock_brakes_true" name="q[car_spec_anti_lock_brakes_true]" value="1" type="checkbox"></input>

当复选框未选中时,返回所有 car_spec_anti_lock_brakes 为 true 或 false 的记录。