您好,我一直在应用程序中使用 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中搜索search
和ransack
,如果模型已经有一个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