2017-03-03 54 views
0

我正試圖將此查詢添加到我的搜索方法中。如何在rails中合併.where()查詢

books = Book.where("category_id LIKE?","%{params[:category]}%").where("price LIKE <= ?", "%#{params[:price]}%"). 

我在做什麼錯?

class Book < ApplicationRecord 
    belongs_to :category 

    def self.search(params) 
     books = Book.where("title LIKE ?","%#{params[:search]}%") if params[:search].present? 
     books = Book.where("category_id LIKE ?","%#{params[:category]}%").where("price LIKE <= ?", "%#{params[:price]}%") 
    end 

books_controller.rb

def search 
    if params[:category].present? 
     @books = Book.where(category_id: params[:category]) 
    elsif params[:search].blank? 
     @books = Book.all 
    else 
     @books = Book.search(params) 
    end 
end 

search.html.erb

<%= form_tag search_books_path, method: :get do %> 
<%= select_tag :category, options_from_collection_for_select(Category.all, :id, :name), :include_blank => "Select Category" %> 
    <%=number_field_tag :price%> 
<%=text_field_tag :search, nil, placeholder: "search" %> 
<%= submit_tag "Search" %> 
+2

什麼是你得到的問題或錯誤消息?你應該能夠將where子句連在一起而不會出現問題。我不確定你使用'LIKE'語法,但是 - 你的'category_id'和'price'列是整數還是文本? 'LIKE'通常用於文本,但這些聽起來像整數字段給我... – Brian

+0

我的[category_id]和價格字段都是整數。我根本沒有任何錯誤。搜索不只是使用規則。它只使用這個規則@books = Book.where(category_id:params [:category]) – user109705

回答

0

你必須把它們連這樣。

def self.search(params) 
    books = Book.all 
    books = books.where("title LIKE ?","%#{params[:search]}%") if params[:search].present? 
    books = books.where("category_id LIKE ?","%#{params[:category]}%").where("price LIKE <= ?", "%#{params[:price]}%") 
end 

不知道爲什麼你使用LIKE對於整數不過,我想簡單的=會做到這一點。比較字符串時,您的LIKE運算符還需要'

def self.search(params) 
    books = Book.all 
    books = books.where("title LIKE '?'",params[:search]) if params[:search].present? 
    books = books.where(category_id: params[:category]).where("price <= ?", params[:price]) 
end 
+0

感謝您的支持。當然,我不假設使用LIKE作爲整數,我的搜索方法省略了「&&」參數。再次使用什麼代碼突出顯示文字 – user109705

+0

突出顯示文字? – Iceman

1

當您提交搜索表單,你if語句params[:category].present?計算結果爲真發送params[:category]價值和你的第一個。這就是爲什麼你只得到的結果:

@books = Book.where(category_id: params[:category]) 

你本可以覆蓋你的if語句這樣:

def search 
    if params[:price].present? && params[:category].present? 
     @books = Book.search(params) 
    elsif params[:category].present? 
     @books = Book.where(category_id: params[:category]) 
    else 
     @books = Book.all 
    end 
end 
+0

嗨,我只是意識到,我不能再使用搜索字段輸入。我輸入的內容將會返回完整的圖書列表。我期望它搜索我在裏面輸入的內容 – user109705

+0

當我添加另一個if語句來指定像param [:search] .present一樣的參數搜索時,發生此錯誤'PG :: InvalidTextRepresentation:ERROR:無效的輸入語法: 「」 「 」選擇「books」。* FROM「books」WHERE(title) LIKE'B')AND「books」。「category_id」= $ 1 AND(price <='')', – user109705