繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM