0

我正在使用Elasticsearch-Model. 我将所有与搜索相关的方法提取到一个ActiveSupport::Concern. 以下代码是在使用 Tire gem 时编写的,但我将 gem 升级到 Elasticsearch-Rails 和 Elasticsearch-Model,因为 Tire 不支持 Elasticsearch 1.x。当前的实现如下所示:

require 'active_support/concern'

module SearchBooks
extend ActiveSupport::Concern

included do
   include Elasticsearch::Model
   include Elasticsearch::Model::Callbacks

   mapping do
      locales = %w['de', 'en', 'fr']
         locales.each do |locale|
            class_eval <<-RUBY
               indexes: ... 
            RUBY
      end
   end
 end

但我收到了这个错误:

/Users/xxx/.rvm/gems/ruby-2.0.0-p647/gems/activesupport-3.2.22/lib/active_support/core_ext/kernel/singleton_class.rb:11:in `class_eval': undefined method `indexes' for #<Class:0x007fea661037ec> (NoMethodError)

我尝试了很多东西,例如 usinddef included(base)和 then base.eval,但我无法进入class_eval正确的范围。

有任何想法吗?

4

1 回答 1

0

结果证明非常简单:

只需使用instance_eval而不是class_eval,因为映射块将内部的所有内容都限定为Elasticsearch::Model::Indexing::Mappings.

于 2016-01-12T11:40:59.720 回答