【问题标题】:Rails 6 Deep DupRails 6 深度学习
【发布时间】:2021-02-25 00:15:31
【问题描述】:

我有一个深度嵌套的对象,我想获得一个更新了其中一个嵌套属性的“dup”版本。

假设我们有一个CountryCityStatePerson

CountrycitystateCitypersons

下面是Country 的示例,比如country_sample

{
  "id"=>16,
  "city"=>
    [{"id"=>22,
      "person"=>
       [{"id"=>11,
         "uuid"=>"20ac322f-5f62-4786-b14b-73e4cc2a9f38",
         "updated_at"=>"2020-11-12T02:59:53.000Z"}]},
     {"id"=>23,
      "person"=>
       [{"id"=>12,
         "uuid"=>"196e8d33-9b2f-4aab-a2eb-1bda645abc31",
         "updated_at"=>"2020-11-12T02:59:53.000Z"}]},
     {"id"=>24,
      "person"=>[]}],
  "state"=>
  [{"id"=>10,
    "given_name"=>"SomeState",
    "updated_at"=>"2020-11-12T02:59:53.000Z"}],
  "other_prop"=>"val"
}

我需要(任何一个都可以):

  1. 我想用id24city添加一个新人,然后需要整个对象的dup版本
  2. 我想获得一个dup 版本并用id 24city 添加一个新人

我面临的问题是: 当我运行dup_country = country_sample.dup 时,我没有得到嵌套属性。

我得到了类似的东西

{
  "id"=>nil,
  "city"=>[],
  "state"=>[],
  "other_prop"=>"val"
}

正如您所见,所有嵌套属性都不存在。我尝试了一堆其他处理 dup 的 gem,例如 (full_dupdeep_dupdeep_dive),但没有任何效果。我想知道可能出了什么问题?


更新:

虽然 deep_dup 适用于发布在 https://apidock.com/rails/Hash/deep_dup 的示例,但我尝试了我拥有的对象,它仍然具有与 dup 相同的效果。

【问题讨论】:

  • 您要复制的对象是什么类型的?从您的示例来看,它看起来像一个哈希
  • 我在主要对象以及它的 JSON 版本上进行了尝试。使用.kind_of? (Hash) 进行检查,它读取的 JSON 是hash。但是,JSON 版本上的 deep_dup 根本没有做任何事情。它返回相同的 JSON。
  • 你能在主对象上做.class吗?
  • 主要对象是 Country 。另一方面,通过.as_json(:include .. nested properties的json版本是Hash

标签: ruby-on-rails ruby serialization


【解决方案1】:

amoeba gem 在对模型进行一些更改后运行良好。

#config on models

# Country
class Country < ApplicationRecord
  ...
  
  amoeba do
    include-_association :city 
    include-_association :state 
  end
  ...
end

# City
class City < ApplicationRecord
  ...
  
  amoeba do
    include-_association :person 
  end
  ...
end

country_deep_dupped = country.amoeba_dup 获取deep-dup 版本,该版本也返回嵌套对象的dup 版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    相关资源
    最近更新 更多