使用Ransack分层导航栏简单搜索以进一步确定范围

时间:2017-10-11 09:19:51

标签: sql ruby-on-rails search ruby-on-rails-5 ransack

我的导航标题上有一个搜索栏,用户可以在其中搜索文章的标题。这将把它们路由到articles / browse.html.erb页面,在那里他们可以根据作者的类别和名称进一步确定结果的范围。

我已按照this教程进行导航栏搜索。我试图使用Ransack来允许在浏览页面上进一步过滤。但是,我很难将两种搜索方法与以下问题结合起来:

1)导航栏搜索工作正常并返回正确的结果,但是当我按类别名称再次过滤结果时,我得到编辑 0结果所有结果。

2)当我使用文章标题在浏览页面上进行初始搜索时,搜索工作正常。但是,当我按照类别/作者名称进一步确定结果范围时,Ransack似乎无法工作。 (编辑:ransack适用于按类别过滤,在browse.html.erb中使用以下编辑,但不适用于作者姓名)

browse.html.erb

  <%= search_form_for @q, url: browse_articles_path, method: :get do |f| %>
    <div class="form-group">
      <div class = "row">
        <div class="col-md-12 col-sm-12 col-xs-12">
          <%= f.search_field :title_cont, placeholder: "Find Articles", class: "form-control" %>
        </div>
      </div>
    </div>
    <div class="form-group">
      <div class ="row">
        <div class="col-md-6 col-sm-6 col-xs-6">
          <%= f.select :categories_name_cont, options_from_collection_for_select(Category.all, //EDIT change "id" to// "name", "name", @q.categories_name_eq), 
                                                                                { :prompt => "Any Category" },
                                                                                { class: "form-control" } %>
        </div>
        <div class="col-md-6 col-sm-6 col-xs-6">
          <%= f.search_field :users_name_cont, class: "form-control", placeholder: "Author" %>
        </div>
      </div>
    </div>
    <div class="form-group">
      <%= f.submit class: 'btn btn-primary btn-md' %>
    </div>
  <% end %>

  <% if params[:search] %>
    <%= render @articles %>
  <% elsif params[:q] %>
    <%= render @articles_morefilter %>
  <% else %>
    <%= render @articles %>
  <% end %>

articles_controller.rb

  def browse
    if params[:search]
      @articles = Article.search(params[:search])
      @categories = Category.joins(:articles).where('articles.title LIKE ?', "%#{params[:search]}%").uniq
    else
      @articles = Article.published.order("cached_votes_up DESC")
      @categories = Category.with_articles.order('name ASC').all
    end

      @q = Article.ransack(params[:q])
      @articles_morefilter = @q.result.includes(:categories, :users)
  end

编辑模式:article.rb

class Article < ApplicationRecord
  belongs_to :user
  has_many :article_categories
  has_many :categories, through: :article_categories

  def self.search(search)
      where('title LIKE ?', "%#{search}%")
  end
end

routes.rb

  resources :articles do
    collection do
      get 'browse'
    end
  end

架构:

  create_table "articles", force: :cascade do |t|
    t.string "title"
    t.text "description"
    t.bigint "user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "name"
  end

_navigation.html.erb

<%= form_tag(browse_articles_path, :method => 'get', :id => "articles_search") do %>
  <div class="form-group">
    <%= text_field_tag :search, params[:search], placeholder: "Search", class: "form-control" %>
  </div>
  <button type="submit" class="btn btn-default">Search</button>
<% end %>

1 个答案:

答案 0 :(得分:0)

你应该能够简单地用搜索搜索所有字段。 (基于当前的browse.html.erb)

def browse
   @q = Article.ransack(params[:q])
   @articles = @q.result.includes(:categories, :users)
end