Пожалуйста, мне нужна помощь для проекта цифровой библиотеки, над которым я работаю. Я хочу добавить в приложение некоторые функции фильтрации поиска.
В приложении в основном есть книги, принадлежащие к подкатегориям, и подкатегории, принадлежащие к категориям.
Я хочу создать функцию фильтрации поиска, в которой вы сможете фильтровать книги по их категориям при поиске конкретной книги.
Итак, сначала вы создаете категории, а затем создаете подкатегории и выбираете категории, к которым относятся эти подкатегории, а затем создаете книги и выбираете только подкатегории, к которым относится каждая книга, что автоматически помещает эту книгу в категорию, к которой относится эта подкатегория. падает под.
На данный момент фильтры поиска работают, только если я добавляю категории в новую форму книг. То есть, если я изменю новую форму книг, а затем включу выбор категории в форму. Но я просто хочу включить в новую форму книг только подкатегории, поскольку каждая подкатегория уже принадлежит категории.
Коды следующие
Модель книги
class Book < ApplicationRecord
belongs_to :category, required: false
belongs_to :subcategory, required: false
def self.search(keywords)
if keywords
where('name LIKE ? OR description LIKE ? OR author LIKE ? OR abstract LIKE ?', "%#{keywords}%", "%#{keywords}%", "%#{keywords}%", "%#{keywords}%").order('id DESC')
else
order('id DESC')
end
end
end
Модель подкатегорий
class Subcategory < ApplicationRecord
belongs_to :category
has_many :books
end
Модель категорий
class Category < ApplicationRecord
has_many :subcategories
has_many :books
end
Контроллер книг (усеченный)
class BooksController < ApplicationController
before_action :set_book, only: [:show, :edit, :update, :destroy]
def index
if params[:category].blank? or params[:category][:id].blank?
@books_view = Book.all
else
@books_view = Category.find(params[:category][:id]).books
end
@books = @books_view.search(params[:keywords]).paginate(page: params[:page], per_page: 12)
end
end
Форма поиска страницы указателя книг
<%= form_tag(books_path, method: :get) do %>
<%= text_field_tag :keywords, params[:keywords], {placeholder: 'eg: Nursing', :class => 'searchForm'} %>
<%= collection_select :category, :id, Category.all.order('name ASC'), :id, :name,{include_blank: 'Select Category'}, { :class => 'form-control'} %>
<button type="submit">
Search
<%= image_tag("searchIcon.svg", :alt => "search", :class => "") %>
</button>
<% end %>
Пожалуйста, мне нужна помощь. Это будет высоко оценено. Спасибо.
Обновить
Я попробовал решение от Dileep Nandanam, обновив Books Controller таким образом.
class BooksController < ApplicationController
before_action :set_book, only: [:show, :edit, :update, :destroy]
def index
if params[:category].blank? or params[:category][:id].blank?
@books_view = Book.all
else
@books_view = Book.joins(:subcatagory).joins('catagories on catagories.id = subcatagories.catagory_id').where(catagories: {id: params[:catagory][:id]})
end
@books = @books_view.search(params[:keywords]).paginate(page: params[:page], per_page: 12)
end
end
Но это действительно не сработало, как ожидалось. Я столкнулся с некоторыми проблемами. Ниже приведен скриншот проблемы.
![NoMethodError in BooksController#index неопределенный метод `[]' для nil:NilClass]1
@books_view = Book.joins(:subcatagory).joins('catagories on catagories.id = subcatagories.catagory_id').where(catagories: {id: params[:catagory][:id]})
. Я также включил скриншот ошибки в обновленный вопрос. - person Promise Preston   schedule 15.06.2019