Ransack::Search在使用Active Admin和Elastic Search时未定义方法"each"?



您好,我一直在应用程序中使用 Railcasts#306 (http://railscasts.com/episodes/306-elasticsearch-part-1) 作为示例的弹性搜索。

一切正常,直到我安装了活动管理员 gem。当我在我的商店#索引页面中传入查询时,我收到以下错误:

Ransack::Search

>:Ransack::Search 的未定义方法 'each'

知道为什么使用 Ransack gem(而不是弹性搜索)进行搜索吗?

以下是与搜索相关的代码片段:

Shop.rb:

class Shop < ActiveRecord::Base
  include Tire::Model::Search
  include Tire::Model::Callbacks
  (...)
  end

shops_controller.rb

  def index
    if params[:query].present?
      @shops = Shop.search(params[:query], load:true)
    else
      @shops = Shop.all
    end
    respond_with(@shops)
  end

商店/索引.html.erb

<%=form_tag shops_path, :method =>:get do %>
<p><%= text_field_tag :query, params[:query] %>
<%= submit_tag "Search", :name => nil, class: "button small success" %></p>
<% end %>

任何帮助将不胜感激,谢谢!

你的问题是你在同一模型上使用ElasticSearch和Ransack(这是ActiveAdmin的依赖项)。

Ransack对这个案子有保护。你可以在Ransack中搜索searchransack,如果模型已经有一个search的方法,Ransack不要过度编写它们。

你需要确保ElasticSearch在Ransack(ActiveAdmin)之前加载,这应该可以解决你的问题,你可以像添加ActiveAdmin之前一样使用你的代码。

@nicooga解决方案的问题在于,它使用Ransack进行搜索,而不是ElasticSearch。

编辑:这应该是最好的解决方案:

如果您使用轮胎:

Shop.tire.search

(来源)

如果使用 elasticsearch-ruby 或 elasticsearch-rails:

Shop.__elasticsearch__.search

(来源)

更新:ActiveAdmin现在在他的文档中有一个关于这个问题的部分。

当你使用洗劫袋时,

Shop.search(params[:query])

返回一个Ransack::Search对象,因此出现"未定义方法each' for Ransack::Search"错误。将其更改为

@shops = Shop.search(params[:query], load:true).result

最新更新