如何在rails中组合.where()查询

时间:2017-03-03 14:22:37

标签: ruby-on-rails activerecord

我尝试将此查询添加到我的搜索方法中。

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 个答案:

答案 0 :(得分:1)

当您提交搜索表单时,您将发送params[:category]值,并且您的第一个if语句params[:category].present?评估为true。这就是为什么你只得到结果:

@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

答案 1 :(得分: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
相关问题