Мне нужна помощь, пожалуйста. Я создаю функцию расширенного поиска для своей цифровой библиотеки, и я хотел бы искать книги по их именам или описанию, а затем фильтровать результаты поиска по категории, к которой принадлежат книги.
База данных структурирована следующим образом: Книги принадлежат подкатегориям и категориям, а подкатегории принадлежат только категориям. Но я хочу фильтровать по категориям.
Допустим, у меня есть книга под названием Великие достижения и Великие разработчики , и они принадлежат к категориям Отличники и Разработчики соответственно. Я хочу, чтобы поиск работал следующим образом: когда я выполняю поиск по ключевому слову Великий , я вижу книги Великие достижения и Великие разработчики , и когда я фильтрую по категория Достижения Я бы видел только Великие Достижения .
Сейчас моя функция расширенного поиска может искать книги по их именам и описаниям, но не может фильтровать книги по категориям в результатах поиска.
Это код модели книги
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 %>
Я приложил снимок экрана с моим журналом консоли после выполнения действия поиска
Пожалуйста, любая форма помощи будет высоко оценена. Спасибо.