2017-03-03 55 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