【问题标题】:undefined method `each' for Ransack::Search when using Active Admin and Elastic Search?使用 Active Admin 和弹性搜索时 Ransack::Search 的未定义方法“每个”?
【发布时间】:2014-12-16 20:55:52
【问题描述】:

您好,我一直在我的应用程序中使用 Elastic Search,以 Railcasts#306 (http://railscasts.com/episodes/306-elasticsearch-part-1) 为例。

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

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

知道为什么要使用 Ransack gem(不是 Elastic Search)进行搜索吗?

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

商店.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 %>

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

【问题讨论】:

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


    【解决方案1】:

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

    Ransack 对此案有保护措施。你可以在 Ransack 中搜索 searchransack,如果模型已经有 search 方法 Ransack 不要重写它们。

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

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

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

    如果你使用轮胎:

    Shop.tire.search
    

    (Source)

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

    Shop.__elasticsearch__.search
    

    (source)

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

    【讨论】:

    • 我认为这应该是公认的答案,太棒了
    【解决方案2】:

    当你使用 ransack 时,

    Shop.search(params[:query])
    

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

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

    【讨论】:

    • 成功了!谢谢你:)。
    • 这并没有解决问题,它仍然使用 Ransack 进行搜索,而不是 ElasticSearch
    • "undefined method 'each' for Ransack::Search" 是错误,但问题是:“知道为什么要使用 Ransack gem(不是 Elastic Search)进行搜索吗?”。您解决了错误,但没有回答问题。
    • 这不回答问题
    • 你们都是对的。 @Alexander,您应该将另一个答案标记为已接受,以便我可以删除这个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多