我试图实现一个搜索栏,当我测试时,它以一种奇怪的方式工作:只能找到最后的字母,或者整个名字。 对不起,如果问题很容易解决,我是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>
这是我的控制人员:
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
答案 0 :(得分:0)
您必须使用 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]}%")