在Elasticsearch-Model中使用类方法`mapping do`

时间:2016-01-11 22:30:02

标签: ruby-on-rails ruby elasticsearch elasticsearch-rails elasticsearch-model

我使用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)

我尝试了很多东西,例如usind def included(base)然后base.eval,但我无法在正确的范围内获得class_eval

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

分辨率非常简单:

只需使用instance_eval而不是class_eval,因为映射块将所有内容范围限定为Elasticsearch::Model::Indexing::Mappings的实例。