簡體   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