使用Active Admin和Elastic Search时,Ransack :: Search的未定义方法`each'?

时间:2014-12-16 20:55:53

标签: ruby-on-rails ruby ruby-on-rails-4 elasticsearch activeadmin

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

在安装Active Admin gem之前,一切正常。当我在我的商店#index页面传递查询时,我收到以下错误:

未定义的方法`每个'对于Ransack ::搜索>:Ransack ::搜索

知道为什么使用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

店/ index.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 %>

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

2 个答案:

答案 0 :(得分:6)

您的问题是您在同一模型中使用ElasticSearch和Ransack(它是ActiveAdmin的依赖项)。

Ransack对此案件有保护。您可以使用searchransack在Ransack中进行搜索,如果模型已经有search方法,则Ransack不要过度编写它们。

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

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

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

如果你使用轮胎:

Shop.tire.search

Source

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

Shop.__elasticsearch__.search

source

更新:ActiveAdmin现在在docs中有关于此问题的部分。

答案 1 :(得分:1)

使用ransack时,

Shop.search(params[:query])

返回Ransack::Search个对象,因此&#34;未定义的方法each' for Ransack::Search&#34;错误。 将其更改为

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