【发布时间】:2019-09-03 01:58:39
【问题描述】:
我需要一些帮助。我正在为我的数字图书馆构建一个高级搜索功能,我想按图书名称或描述搜索图书,然后按图书所属的类别过滤搜索结果。
数据库的结构是这样的:书籍属于子类别和类别,而子类别仅属于类别。但我想按类别过滤。
假设我有一本名为 Great Achievers 和 Great Developers 的书,它们属于 Achievers 和 Developers 类别强>分别。我希望以这种方式进行搜索:当我使用关键字 Great 进行搜索时,我会看到 Great Achievers 和 Great Developers 这本书,而当我使用我按成就者类别过滤,我只会看到伟大成就者。
目前我的高级搜索功能可以按书名和描述搜索图书,但无法在搜索结果中按类别过滤图书。
这是书本模型的代码
class Book < ApplicationRecord
has_one_attached :upload
belongs_to :category, required: false
belongs_to :sub_category, required: false
def self.search(keywords)
if keywords
where("name LIKE ? OR description LIKE ? OR author LIKE ?", "%#{keywords}%", "%#{keywords}%", "%#{keywords}%").order('id DESC')
else
order('id DESC')
end
end
end
这是类别模型的代码
class Category < ApplicationRecord
has_many :sub_categories
has_many :books
end
这是子类别模型的代码
class SubCategory < ApplicationRecord
has_many :books
belongs_to :category, required: false
end
这是图书控制器的截断代码
class BooksController < ApplicationController
def index
@books = Book.search(params[:keywords]).paginate(:page => params[:page], :per_page => 9).order('created_at DESC')
end
private
def set_book
@book = Book.find(params[:id])
end
def book_params
params.require(:book).permit(:name, :author, :description, :category_id, :sub_category_id, :new_sub_category_name, :upload, :keywords, :deep_keywords)
end
end
这是图书索引视图中搜索功能的截断代码
<%= form_tag(books_path, method: :get) do %>
<%= text_field_tag :keywords, params[:keywords] %>
<%= collection_select :category, :id, Category.all.order('name ASC'), :id, :name,{include_blank: 'Select Category'} %>
<%= submit_tag 'Search', name: nil %>
<% end %>
我们将不胜感激任何形式的帮助。谢谢。
【问题讨论】:
标签: ruby-on-rails search