【问题标题】:Cast n level nested models to corresponding classes in Ruby将 n 级嵌套模型转换为 Ruby 中的相应类
【发布时间】:2016-07-21 08:03:47
【问题描述】:

我是红宝石新手。我正在从 ruby​​ 客户端调用 REST api,该 API 返回一个模型。模型包含嵌套的复杂对象,平均最多 4 级。可以说,模型是 Customer,我在我的 ruby​​ 客户端应用程序中创建了一个类 Customer。想象一下:

外部类:

class Customer
 def CustomerCards=(address) #inner complex object
  @address = address
 end
 #... other complex objects

end

内部类CustomerCard

class CustomerCard
 def CardDetails=(carddetails) #inner-inner complex object
  @carddetails= carddetails
 end
 #... other complex objects

end

inner->内部类CardDetails

class CardDetails
 def Cardvalidations=(cardvalidations) #inner-inner-inner complex object
  @cardvalidations = cardvalidations
 end
 #... other complex objects

end

inner->inner->内部类CardValidations

class Cardvalidations
 def MaxTranxLimit=(maxTranxLimit ) #inner-inner-inner complex object
  @maxTranxLimit= maxTranxLimit
 end
 #... other complex objects

end

在这种情况下,我必须手动JSON.parse 每个属性(返回哈希),并将其转换为相应的对象,最多 n 级。这似乎不是一个有效的解决方案。 (想象一下,我在Customer 模型中有大约 8 个复杂属性,而且每个属性的模型还包含另外 8 个复杂属性)

问题:有没有通用的方法来做到这一点?

我了解,我们无法在 ruby​​ 类中定义属性类型,但由于我是 Ruby 新手,所以我一定遗漏了一些东西。并且必须有一些解决方案,因为 REST 调用非常普遍。

【问题讨论】:

  • 我们可以看到一个哈希来的例子吗?我相信人们可能会以与在哈希中调用对象相同的方式调用对象并使用元编程技术实例化它们(基本上它在类 Java 语言中称为“反射”。)
  • @mudasobwa,确切地说,你听起来像我要找的东西。这是我得到的哈希:{"AddressId"=>"0", "AddressLine1"=>nil, "AddressLine2"=>nil, "City"=>nil, "CountryName"=>nil, "SubDivision"=>nil, "State"=>nil, "ZipCode"=>nil}
  • Ehh...我没有看到类名和哈希中的键之间有任何关联。
  • @mudasobwa,我也观察到了同样的情况。这似乎不可能。
  • @mudasobwa 顺便说一句,如果我看到大多数外部模型的哈希,似乎有一点可能性,因为内部模型以 propertyname 开头:{"CreditCardDetail"=>{"CardholderName"=>"ZEESHAN MUSTAFA", "CVV"=>nil },"OtherComplexProp"=>{"xyz"=>"123", ... 这里CreditCardDetails 是一个复杂的属性外部模型。但是,它似乎会变得一团糟,因为我必须更改属性名称和东西,才能利用反射技术。

标签: ruby json parsing casting


【解决方案1】:

AFAIK 没有通用的方法来做到这一点,部分原因可能是 API 响应从不与您的模型结构 1/1 匹配。但这很容易实现。我会使用 MyModel.load_from_hash 工厂方法之类的方法,然后从子模型中递归调用相应的工厂方法。然后,您可以将此功能提取到关注点中。

【讨论】:

    猜你喜欢
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 2013-11-13
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多