搜索栏Ruby On Rails的问题

时间:2015-10-20 17:59:23

标签: ruby-on-rails ruby

我试图实现一个搜索栏,当我测试时,它以一种奇怪的方式工作:只能找到最后的字母,或者整个名字。   对不起,如果问题很容易解决,我是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

1 个答案:

答案 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]}%")

的内容