我试图实现一个搜索栏,当我测试时,它以一种奇怪的方式工作:只能找到最后的字母,或者整个名字。 如果问题很容易解决,我很抱歉,我是 Ruby On Rails 的新手,我真的需要修复这个问题,但我自己找不到解决方法。 (抱歉我的英语不好)
这是我的 html:
<div class="search">
<%= form_for root_path, :url => {:action => "search"}, class: 'navbar-form' do |f| %>
<%= text_field_tag 'ad[price_min]', @ads_min, :placeholder => "Price min", class: "form-control embed-responsive-item" %>
<%= text_field_tag 'ad[price_max]', @ads_max, :placeholder => "Price max", class: "form-control embed-responsive-item" %>
<%= text_field_tag 'ad[title]', @ads_text, :placeholder => "Search xablau by name", class: "form-control embed-responsive-item" %>
<button class="btn btn-info" ><i class="glyphicon glyphicon-search"></i></button>
<% end %>
</div>
这是我的 Controller :
def search
if params[:ad].present?
@ads_min = params[:ad][:price_min]
@ads_max = params[:ad][:price_max]
@ads_title = params[:ad][:title]
@ads = Ad.search( params[:ad] )
else
@ads = Ad.all
end
render :action => 'index'
end
这是我的模型:
def self.search(query)
price_min = query[:price_min].present? ? "price >= #{query[:price_min].to_f}" : nil
price_max = query[:price_max].present? ? "price <= #{query[:price_max].to_f}" : nil
title = query[:title].present? ? "title LIKE '%#{query[:title]}'" : nil
query = [title, price_min, price_max].compact.join(" AND ")
return Ad.where( query )
end
您必须使用ILIKE 和%text%
而不是 %text
title = query[:title].present? ? "title ILIKE '%#{query[:title]}%'" : nil
因为 %text%
匹配任何包含 text
的字符串但是%text
仅与具有 text
的字符串匹配在字符串的末尾。
PS:你必须重写 search
方法,因为将基于用户的文本放在 sql 中是不安全的。不要那样做"title LIKE '%#{query[:title]}'"
写类似的东西where("title ILIKE ?", "%#{params[:q]}%")
我是一名优秀的程序员,十分优秀!