搜索查询未获取给定的输入 - ActiveRecord枚举LIKE

时间:2017-12-01 03:44:41

标签: ruby-on-rails

尝试在rails app上实现简单搜索。

productions_controller

def filter
    if params[:filter]
      @productions = Production.where('productions.status like ?', "%#{Production.statuses[params[:filter]]}%")
    else
      @productions = Production.all
    end
end

索引页面上有一个记录列表。我正在基于枚举数据类型的status在这些列表上实现搜索/过滤。

index.html.erb

<%= form_tag [:filter, :productions], :method => 'get' do %>
  <p>
    <%= text_field_tag :filter, params[:filter] %>
    <%= submit_tag "Filter", :status => nil %>
  </p>
<% end %>

当我在文本字段中输入关键字pre时,这就是日志中发生的事情

Processing by ProductionsController#filter as HTML
  Parameters: {"utf8"=>"✓", "filter"=>"pre", "commit"=>"Filter"}
  Rendering productions/filter.html.erb within layouts/application
  Production Load (0.4ms)  SELECT "productions".* FROM "productions" WHERE (productions.status like '%%')
  Rendered productions/filter.html.erb

它看起来像是在输入关键字而不是在查询时。也许我错了。有人可以帮我吗?

按要求添加 production.rb

class Production < ApplicationRecord    
  enum status:{
    Preproduction:1,
    Postproduction: 2,
    Completed:3
  } 
end

4 个答案:

答案 0 :(得分:1)

实际上,您不能像使用LIKE语句一样使用枚举。只有你这样查询它才会有用。

@productions = Production.where(status: "Preproduction")

这是另一篇有类似问题的帖子:
rails 5 enum where "like"

我建议你改变

<%= form_tag [:filter, :productions], :method => 'get' do %>
  <p>
    <%= text_field_tag :filter, params[:filter] %>
    <%= submit_tag "Filter", :status => nil %>
  </p>
<% end %>

到这个

<%= form_tag [:filter, :productions], :method => 'get' do %>
  <p>
    <%= select_tag :filter, options_for_select(Production.statuses) %>
    <%= submit_tag "Filter", :status => nil %>
  </p>
<% end %>

答案 1 :(得分:1)

由于状态存储为整数,您可以使用以下方法根据状态值过滤productions

def filter
    filtered_statuses = params[:filter].present? ? Production.statuses.select{|k, v| k.to_s.include?(params[:filter])} : nil

    if filtered_statuses
      @productions = Production.where(status: filtered_statuses.values)
    elsif params[:filter].present?
      @productions = []  # To return empty if no search filter matches production statuses
    else
      @productions = Production.all
    end
end

答案 2 :(得分:0)

只传递params[:filter] 喜欢这些

def filter
    if params[:filter]
      @productions = Production.where('productions.status like ?', "%#{params[:filter]}%")
    else
      @productions = Production.all
    end
end

答案 3 :(得分:0)

您正在传递pre作为过滤器,并且您没有pre的任何状态,这与您无法找到任何数据的原因相同。
但是,您仍需要稍微更新代码

     @productions = Production.where('productions.status like ?', "%#{Production.statuses[params[:filter].capitalize]}%")

问题不在于代码,好像过滤词不匹配它会给你nil的任何键,因为你已经在进行字符串插值,所以它会变成空白,最后你试图访问{{1看起来你的枚举不起作用。如果您为枚举提供过滤器,请提供选择字段而不是输入,并根据答案中提到的状态直接过滤数据 希望这可能会有所帮助