我遇到了麻烦。例如,我有一个模型文章,以及我的search_data
方法
def search_data
title: title,
body: body
end
我需要根据某些属性从控制器接收一些记录,例如:
def index
@articles = Article.where(user_id: user_id).search(query)
end
但是这种方法根据search
方法中的查询忽略where
方法接收了所有数据,而我需要通过search
方法在where
方法接收的数据中搜索。如何解决这个问题?
更新
希望在where
方法之前使用search
,而不是在其内部
答案 0 :(得分:1)
似乎SearchKick不允许您将搜索链接到ActiveRecord之类的关系。它使用ElasticSearch搜索而不是数据库,因此如果您这样做,您将查询两个数据库以获取信息。但是search
方法为it does provide a where
option:
Article.search(query, where: {user_id: user_id})
如果您必须首先进行ActiveRecord查询,则可以从第一个查询中获取ID并将其提供给第二个查询。
ids = Article.where(user_id: user_id)
Article.search(query, where: {id: ids})
答案 1 :(得分:0)
您可以使用方法records
,以便可以通过where
方法过滤结果。像这样:
@articles = Article.search(query).records.where(user_id: user_id)
如果您的搜索方法返回一个Searchkick::Results
对象,那么您将没有records
方法,我将通过{{1 }} 方法。像这样:
Elasticsearch::Model::Response::Response
您可以了解更多有关如何使用elasticsearch-rails gem documentation访问记录的信息
答案 2 :(得分:0)
这里的关键是确保您的 where 查询中的每个属性也存在于您的 search_data 方法中。示例:
Message.search search_term, where: {or: [[{user_id: current_user.id}, {recipient_id: current_user.id}]]}
我希望找到当前用户是发件人或收件人的 search_term
邮件。
因此在我的 search_data 方法中(在 model.rb
中)我应该:
def search_data
{ user_id: user_id,
recipient_id: recipient_id,
title: title,
description: description,
}
这很好用。这是使用 Searchkick gem。