首页 > 解决方案 > 如何使用点符号访问 Chewy 结果?

问题描述

我正在使用Toptal 的 Chewy gem来连接和查询我的 Elasticsearch,就像 ODM 一样。

我将Chewy与 Elasticsearch 6、Ruby on Rails 5.2 和 Active Record 一起使用。

我已经像这样定义了我的索引:

class OrdersIndex < Chewy::Index
  define_type Order.includes(:customer) do

    field :id, type: "keyword"

    field :customer do
      field :id, type: "keyword"
      field :name, type: "text"
      field :email, type: "keyword"
    end
  end
end

我的模型:

class Order < ApplicationRecord
  belongs_to :customer
end

这里的问题是,当我使用 Chewy 执行任何查询时,客户数据会被反序列化为哈希而不是对象,并且我不能使用点符号来访问嵌套数据。

results = OrdersIndex.query(query_string: { query: "test" })
results.first.id
# => "594d8e8b2cc640bb78bd115ae644637a1cc84dd460be6f69"

results.first.customer.name
# => NoMethodError: undefined method `name' for #<Hash:0x000000000931d928>

results.first.customer["name"]
# => "Frederique Schaefer"

如何使用点符号 ( result.customer.name) 访问嵌套关联?或者反序列化对象(例如结构)中的嵌套数据,这允许我使用点表示法?

标签: ruby-on-railsrubychewy-gem

解决方案


尝试使用

results = OrdersIndex.query(query_string: { query: "test" }).objects

它将查询结果转换为活动记录对象。所以点符号应该可以工作。如果要加载与上述结果的任何额外关联,可以在 Index 上使用 .load 方法。

如果您想将现有的 ES 嵌套对象转换为可使用点表示法访问,请尝试参考此答案。Open Struct 是在 ruby​​ 中完成任务的最佳方式。

无法对 ruby​​ 哈希使用点语法

另外,这个也有帮助

如果您需要 openStruct 为嵌套对象工作,请参阅此链接


推荐阅读