[英]Rails: Filter ActiveRecord Search Results using Checkboxes
我正在尝试建立一个复选框过滤器,以减少每个选中框的结果数量。 每个复选框将通过关联表示一个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
通过“书籍”控制器,用户可以运行“搜索”操作,该操作将呈现一个显示所有书籍的视图页面。 通过在侧边栏中选中复选框(每个复选框均标有主题名称),用户应该能够缩小适合其搜索范围的书籍数量。 到目前为止,这是搜索操作:
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
我应该如何修改查询以进行过滤? 谢谢!!!
我认为您的代码几乎可以,但是为什么要拥有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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.