2015-10-20 76 views
2

我試圖實現一個搜索欄,當我測試時,它以奇怪的方式工作:只能找到最後一個字母或整個名稱。 如果問題很容易解決,我很抱歉,我是Ruby On Rails的新手,我真的需要這個修復,我無法找到如何解決它自己。 (對不起我的英文不好)搜索欄的問題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

你必須使用ILIKE%text% i的%text

title = query[:title].present? ? "title ILIKE '%#{query[:title]}%'" : nil 

因爲%text%與包含text%text只與字符串匹配的是對字符串的結尾text任意字符串匹配nstead。

PS:您必須重寫search方法,因爲它不安全,因此將基於用戶的文本放在sql中。不要這樣做"title LIKE '%#{query[:title]}'"寫這樣的東西where("title ILIKE ?", "%#{params[:q]}%")

+0

如果你使用佔位符,那麼他不會得到SQL注入攻擊。 – max

+0

我剛剛試過這個,並得到這個錯誤信息: ActiveRecord :: StatementInvalid在索引#搜索 SQLite3 :: SQLException:接近「ILIKE」:語法錯誤:SELECT「ads」。* FROM「ads」WHERE(title ILIKE' %a%') – Zebiro

+0

@Zebiro只使用'LIKE'我以爲你在使用psql。 SQLite沒有ILIKE功能。 – Arsen