チェックボックスをオンにすると、結果の数が少なくなるチェックボックスフィルタを作成しようとしています。各チェックボックスは、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
フィルタリングを可能にするためにクエリを変更する方法を教えてください。ありがとうございました!!!
おかげにコードを変更する
てみてくださいカウントライン)。しかし、私は「歴史的」と「叙事詩的」をチェックすると、私は歴史的な叙事詩だけを必要とする時には、歴史的なものもすべて叙事詩的なものをまだ得ている。何かご意見は? –
非常に奇妙です。それが生成する正確なSQLを提供できますか?サーバーログが表示されます。 – Aleksey
確かに! 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 –