尝试在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
答案 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看起来你的枚举不起作用。如果您为枚举提供过滤器,请提供选择字段而不是输入,并根据答案中提到的状态直接过滤数据
希望这可能会有所帮助