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