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
如何为 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