Rails:使用复选框过滤ActiveRecord搜索结果



我试图建立一个复选框过滤器,这将减少每个复选框的结果数量。每个复选框将通过关联表示一个has_many:。

我有一个有三个模型的应用程序:书主题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

通过Books控制器,用户可以运行Search操作,这将呈现一个显示所有图书的视图页面。通过选中侧边栏中的复选框(每个复选框都标有主题名称),用户应该能够缩小适合他们搜索的图书数量。这是目前为止的搜索操作:

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

现在,如果用户选择"历史的"one_answers"史诗的",他们会得到所有以历史为主题的书,以及所有以史诗为主题的书。我希望他们只买历史题材和史诗题材的书。我试过在查询中添加.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

我应该如何修改我的查询使过滤成为可能?谢谢你! !

我认为你的代码几乎是好的,但为什么你有having("count(*) >= ?", 1) ?
该条件适用于所有必读书目中只有一个主题的图书。
尝试将代码更改为以下

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

最新更新