2016-09-24 1 views
0

チェックボックスをオンにすると、結果の数が少なくなるチェックボックスフィルタを作成しようとしています。各チェックボックスは、has_many:throughアソシエーションを表します。Rails:Filter ActiveRecord検索結果のチェックボックスを使用

私は3つのモデルとアプリがあります。 BookSubjectは、彼らがそうのよう

関連している ブック 件名:書籍コントローラを介して

class Book < ActiveRecord::Base 
    has_many :book_subjects 
    has_many :subjects, through: :book_subjects 
end 

class Subject < ActiveRecord::Base 
    has_many :book_subjects 
    has_many :books, through: :book_subjects 
end 

class BookSubject < ActiveRecord::Base 
    belongs_to :book 
    belongs_to :subject 
end 

は、ユーザーがレンダリング検索アクションを実行することができますすべての書籍が表示されたビューページ。サイドバーのボックス(それぞれが件名のラベルが付いている)にチェックを入れることで、ユーザーは検索に合った本の数を絞り込むことができます。被写体としての叙事詩で、ユーザが「歴史」と「叙事詩」を選択した場合、彼らは主題として歴史的にすべての書籍を取得今

def search 
    if params[:name].nil? || params[:name].empty? 
    @all_books = Book.all 
    else 
    @all_books = Book.joins(:subjects).where(subjects: {name: params[:name].split(",")}).distinct 
    end 
    render 'search' 
end 

、そしてすべての書籍:これは、これまでの検索アクションです。歴史と叙事詩の両方を題材にした本のみを入手したいと思います。 .groupをクエリに追加しようとしましたが、これまで動作していませんでした。

def search 
    if params[:name].nil? || params[:name].empty? 
    @all_books = Book.all 
    else 
    @all_books = Book.joins(:subjects) 
     .where(subjects: {name: params[:name].split(",")}) 
     .group("books.id") 
     .having("count(*) >= ?", 1) 
    end 
    end 
end 

フィルタリングを可能にするためにクエリを変更する方法を教えてください。ありがとうございました!!!

答えて

1

あなたのコードはほとんど問題ないと思いますが、なぜhaving("count(*) >= ?", 1)がありますか?
この条件は、すべての必須リストの件名が1つしかない本に一致します。私はnames.sizeをつかむためにのために欠けていた何だった( - .split(「」)行:[名]名=のparamsのために、次の

def search 
    @all_books = if params[:name].blank? 
    Book.all 
    else 
    names = params[:name].split(',') 
    Book.joins(:subjects) 
     .where(subjects: { name: names }) 
     .group(:id) 
     .having('count(*) = ?', names.size) 
    end 
end 
+0

おかげにコードを変更する
てみてくださいカウントライン)。しかし、私は「歴史的」と「叙事詩的」をチェックすると、私は歴史的な叙事詩だけを必要とする時には、歴史的なものもすべて叙事詩的なものをまだ得ている。何かご意見は? –

+0

非常に奇妙です。それが生成する正確なSQLを提供できますか?サーバーログが表示されます。 – Aleksey

+0

確かに! 1つのボックスをチェックする:ブックロード(0.9ms)SELECT "books" INNER JOIN "book_subjects" ON "book_subjects" "book_id" = "books" "id" INNER JOIN " "name" = 'epic/saga' GROUP BY books.id HAVING count(*)> = 1 –