Rails 4个多对多关系的searchkick

Rails 4 searchkick with many-to-many relationsip

如何为 searchkick 实现类别过滤器。基本上我有一个接受查询词的输入字段,但我还想要一个下拉菜单,用户可以选择一个类别来搜索或在所有类别中搜索。帖子和类别之间存在多对多关系

我的模型是:

-- post.rb
class Post < ActiveRecord::Base
 has_many :post_categories
 has_many :categories, through: :post_categories
 searchkick text_start: [:title]
end

-- category.rb
class Category < ActiveRecord::Base
    has_many :post_categories
    has_many :posts, through: :post_categories
end

--post_category.rb
class PostCategory < ActiveRecord::Base
    belongs_to :post
    belongs_to :category
end

现在,在我的 posts_controller 索引操作中,我有以下内容,到目前为止,它通过返回与查询参数匹配的所有帖子或 returns 所有帖子(如果没有提供查询参数)来工作搜索输入。

class PostsController < ApplicationController

    def index
        query = params[:q].presence || "*"
        @posts = Post.search (query)
    end
end

到目前为止效果很好。但我还想在视图中添加一个类别过滤器,以便用户可以选择在特定类别内搜索查询字符串,或者如果没有选择类别则在所有类别中搜索。提前致谢。

根据 searchkick 文档,您可以将参数添加到 .search 查询 - 请参阅 here 查询部分,具体位置。来自文档的示例:

Product.search "apples", where: {in_stock: true}, limit: 10, offset: 50

应该是smt

Post.search query, where: {category: [some_array]}

注意 - searchkick gem 将条件从 where 语句转换为 ElasticSearch 过滤器(参见 here

Update - 要按相关 objects(不是模型本身)的属性进行搜索,您应该将其字段包含在 search_index 中 - 请参阅示例 here

将类别标题添加到 search_data 方法。

class Project < ActiveRecord::Base
  def search_data
    attributes.merge(
      categories_title: categories.map(&:title)
    )
  end
end

还有this关于相关主题的问题

默认情况下,searchkick 的 search_data 是 serializable_hash 模型调用的 return - 请参阅 sources 以供参考。

def search_data
  respond_to?(:to_hash) ? to_hash : serializable_hash
end unless method_defined?(:search_data)

默认情况下不包含任何关联,除非使用 :include 参数传递 - source

 def serializable_hash(options = nil)
    ...
    serializable_add_includes(options) do ..
 end

 def serializable_add_includes(options = {}) #:nodoc:
   return unless includes = options[:include]
 ...
 end