Rails:使用信息搜索和过滤图书类别

时间:2019-04-30 16:00:24

标签: ruby-on-rails search

请给我一些帮助。我正在建立一个数字图书馆,我想按名称,作者和描述搜索书籍,并按每本书分类的类别对其进行过滤。

每本书都放在一个子类别下,而该子类别则放在一个类别下。因此,对于每本书而言,它属于一个类别,而该类别又属于一个子类别。

模型关联是这样的

这是类别模型的代码

class Category < ApplicationRecord
  has_many :sub_categories
  has_many :books
end

这是子类别模型的代码

class SubCategory < ApplicationRecord
  has_many :books
  belongs_to :category
 end

这是图书模型的代码

class Book < ApplicationRecord
  has_many :categories
  has_many :subcategories

  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

Books Controller代码

def index 
  if params['category'].blank? or params['category']['id'].blank? 
    @books = Book.all 
  else 
    category = Category.find(params['category']['id']) 
    @books = category.books 
  end 
  @books = @books.search(params[:keywords]).paginate(:page => params[:page], :per_page => 9).order('created_at DESC') 
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 %>

如何为该高级搜索实现if语句。

仅在启动搜索操作时,以及在使用“高级搜索表单”进行搜索时,如何使用if语句在“图书索引”页面上显示高级搜索表单? 显示图书:关键字”,如果没有找到结果,则应向我显示此消息“ 未找到结果

我曾尝试从此处的贡献者的建议中实施图书索引页面上的“无记录”,但我也遇到错误。

这是我的代码

<%= render 'advanced_search' if @show_advanced_search %>
<% if @books.empty? %>
  <p>No Records Found</p>

<% else %>
  ....
<% end %>

Error Message

请提供任何形式的帮助,我们将不胜感激。谢谢

1 个答案:

答案 0 :(得分:0)

您可以在进行快速搜索后设置标记:

def index 
  if params['category'].blank? or params['category']['id'].blank? 
    @books = Book.all 
  else 
    category = Category.find(params['category']['id']) 
    @books = category.books 
    @show_advanced_search = true
  end 
  @books = @books.search(params[:keywords]).paginate(:page => params[:page], :per_page => 9).order('created_at DESC') 
end

然后,在视图中:

<%= render 'advanced_search' if @show_advanced_search %>

更新:基于结果的条件文本:

<% if @books %>
  <h3>Showing books for <%= @keywords %></h3>
  .
  .
  .
<% else %>
  No results found.
<% end %>