searchkick请求与活动记录请求一起使用

时间:2018-02-20 10:14:34

标签: ruby-on-rails ruby searchkick

我遇到了麻烦。例如,我有一个模型文章,以及我的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,而不是在其内部

3 个答案:

答案 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。