我使用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
。
有什么想法吗?
答案 0 :(得分:0)
分辨率非常简单:
只需使用instance_eval
而不是class_eval
,因为映射块将所有内容范围限定为Elasticsearch::Model::Indexing::Mappings
的实例。