我试图建立一个复选框过滤器,这将减少每个复选框的结果数量。每个复选框将通过关联表示一个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