2017-03-03 13 views
0

このクエリを検索メソッドに追加しようとしています。レールで.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

my [category_id]とpriceフィールドは両方とも整数です。私はまったくエラーはありません。検索は単にルールを使用するだけではありません。このルールのみを使用しています。@books = Book.where(category_id:params [:category]) – user109705

答えて

0

あなたはこのようなチェーン彼らがする必要があります。あなたがが整数のLIKEを使用している理由

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演算子には'が必要です。あなたが検索フォームを送信すると声明params[:category].present?がtrueと評価された場合

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

、あなたはparams[:category]値を送信し、あなたの最初のされています。あなただけの結果を得ている理由です:

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

文の場合は、これにあなたを上書きしている可能性が:あなたが取得している問題やエラーメッセージは何

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

param [:search] .presentのようなparamの検索を指定する別のif文を追加すると、 'PG :: InvalidTextRepresentation:ERROR: ""LINE 1:... e LIKE 'B')AND "books" "category_id" = $ 1 AND(価格<= '') ^ :SELECT "books"。* FROM "books" WHERE LIKE 'B')AND "books"。 "category_id" = $ 1 AND(価格<= '') '、 – user109705