【发布时间】:2016-09-24 19:31:24
【问题描述】:
我正在尝试构建一个复选框过滤器,该过滤器将减少选中每个框的结果数量。每个选中的框将代表一个 has_many: 通过关联。
我有一个包含三个模型的应用程序: 书 学科 图书主题
它们是这样关联的:
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
现在,如果用户选择“历史”和“史诗”,他们将获得所有以历史为主题的书籍,以及所有以史诗为主题的书籍。我希望他们只获得以历史和史诗为主题的书籍。我尝试将 .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
我应该如何修改我的查询以使过滤成为可能?谢谢!!!
【问题讨论】:
标签: ruby-on-rails activerecord