尽管包含在内,但是模型中没有关注模块(NoMethodError)

时间:2015-03-04 03:08:39

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

我将我的应用从solr迁移到Elasticsearch进行文档搜索。部署Elasticsearch的推荐模式是在Rails关注中包含Elasticsearch功能(即Elasticsearch::ModelElasticsearch::Model::Indexing),然后在模型中包含此模块。我已经实现了这一点。 (有些方法暂时被注释掉,因为我正在努力解决这个问题。)

#app/models/concerns/elasticsearch_user.rb
require 'active_support/concern'

module ElasticsearchUser

extend ActiveSupport::Concern

included do
  require 'elasticsearch/model'
  include Elasticsearch::Model
  include Elasticsearch::Model::Indexing

  #mapping do
  #  #to-do
  #end

  #def self.search(query)
  #  _elasticsearch_.search(
  #    {
  #        query: {
  #         multi_match: {
  #             query: query,
  #             fields: ['username^2', 'email', 'full_name']
  #         }
  #        }
  #    }
  #  )
  #end

  end
end


#User.rb
...
# Elasticsearch configuration
include ElasticsearchUser
# index_name "users" <-- This value is inferred automatically by the model name
settings index: { number_of_shards: 1 } do
  mappings dynamic: 'false' do
    indexes :username
    indexes :email
    indexes :full_name
  end
end
...
def as_indexed_json(options={})
  self.as_json(only: [:username, :email, :full_name],
               methods: [:full_name]
  )
end

我可以毫无问题地致电Model.importModel.search。调用Model._elasticsearch_.create_index!(带有和不带_elasticsearch_命名空间)之类的东西会抛出NoMethodError。我已经尝试将Elasticsearch::Model直接包含在我的模型定义中但没有成功。我也试过要求'active_support / concern&#39;在我的模型的顶部 - 也没有运气。很明显模块/关注点没有包含在我的模型中,但我无法弄清楚原因。

2 个答案:

答案 0 :(得分:0)

您使用的是正确的导轨版本吗? 尝试!!在控制台

require 'active_support/concern'

如果返回nil模块未导入

答案 1 :(得分:-1)

这实际上与包括关注无关。我在搜索方法中添加了一些日志记录(we made it to the search),并在控制台输出中找到了它。在Elasticsearch的帮助下,我们意识到我使用的是_elasticsearch_,但它的__elasticsearch__有两个下划线。在所有的事情......