Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 数据重新格式化的最佳实践/设计模式_Ruby On Rails_Design Patterns - Fatal编程技术网

Ruby on rails 数据重新格式化的最佳实践/设计模式

Ruby on rails 数据重新格式化的最佳实践/设计模式,ruby-on-rails,design-patterns,Ruby On Rails,Design Patterns,我的项目是一个连接两个主要服务的微型服务,我的项目从一个服务器获取数据,格式化数据,然后使用数据生成XML文件,然后将XML上传到另一个服务。我只是想知道这种微服务是否有设计模式 这是从后端服务器接收到的JSON: { "employee_id": 100464, "organization_id": 93, "start_date": "2018-09-05", "first_name": "Tom", "departments": [

我的项目是一个连接两个主要服务的微型服务,我的项目从一个服务器获取数据,格式化数据,然后使用数据生成XML文件,然后将XML上传到另一个服务。我只是想知道这种微服务是否有设计模式

这是从后端服务器接收到的JSON:

{
    "employee_id": 100464,
    "organization_id": 93,
    "start_date": "2018-09-05",
    "first_name": "Tom",
    "departments": [
        {
            "id": 2761,
            "name": "Sale",
            "organization_id": 93
        },
        {
            "id": 2762,
            "name": "Product",
            "organization_id": 93
        }
    ],
    "primary_department": {
        "id": 2761,
        "name": "Product",
        "organization_id": 93
    }
}
这是我想要的数据格式,因此我需要进行一些数据格式化:

{
    "employee_id": 100464,
    "organization_id": 93,
    "first_name": "Tom",
    "target_department": {
        "department_id": 2761,
        "name": "Product",
        "organization_id": 93,
        "is_primary_department": true
    }
}
确定目标部门的逻辑是

departments = hsh.delete :departments
primary_department = hsh.delete :primary_department
hsh[:target_department] = departments.select do |department|
  department[:id] ==another_obj[:group_id]
end.first
hsh[:target_department][:is_home_department] = (hsh[:target_department][:id] == primary_department[:id])
hsh[:target_department][:department_id] = hsh[:target_department].delete :id
如您所见,我需要删除、重命名和重新格式化属性和数据结构

在这个过程中,有许多潜在的问题:属性不存在? 我的问题是,从编程设计的角度来处理这个问题的最佳实践是什么


我正在使用Rails,所以任何好的gem或项目都在处理类似的问题?

我不知道最佳实践,但这应该满足您的需要

{
  "employee_id": 100464,
  "organization_id": 93,
  "start_date": "2018-09-05",
  "first_name": "Tom",
  "departments": [
    {
      "id": 2761,
      "name": "Sale",
      "organization_id": 93
    },
    {
      "id": 2762,
      "name": "Product",
      "organization_id": 93
    }
  ],
  "primary_department": {
    "id": 2761,
    "name": "Product",
    "organization_id": 93
  }
}.with_indifferent_access.except(:start_date, :departments).transform_keys do |k|
  k == 'primary_department' ? 'target_department' : k
end.tap do |hsh|
  if hsh['target_department']
    hsh['target_department']['is_primary_department'] = true
    hsh['target_department']['department_id'] = hsh['target_department']['id']
    hsh['target_department'].delete('id')
  end
  puts hsh
end
在控制台中,这将返回:

{
  "employee_id"=>100464,
  "organization_id"=>93,
  "first_name"=>"Tom",
  "target_department"=>{
    "name"=>"Product", 
    "organization_id"=>93, 
    "is_primary_department"=>true, 
    "department_id"=>2761
  }
}

顺便说一句,在您的示例输出中,您将目标部门名称显示为“aProduct”。这是打字错误吗?

以编程方式直接处理json/xml类型的数据通常很乏味。我曾经在一家到处都这样做的公司工作过,这很痛苦。我建议将数据反序列化为对象图表示。还有一个可以通过查询/处理输入对象图来构造的结果类。然后在最后将结果对象序列化回json


您可能会找到一个内置或开源解决方案来为您处理序列化和反序列化。

感谢您的回复,但目标部门并不总是主要部门,它取决于另一个对象的属性,逻辑'departments=hsh.delete:departments primary\u department=hsh.delete:primary\u department hsh[:target\u department]=departments.select do | department | department[:id]==另一个对象[:group\u id]结束。首先,'有什么建议吗?你能把这个逻辑添加到你的问题中吗(格式不正确时很难理解)?该代码看起来很正常(我没有运行它,所以它可能不可靠)。你有什么特别的问题吗?我的项目是连接两个主要服务的微型服务,我的项目从一台服务器获取数据,格式化数据,然后使用数据生成XML文件,然后将XML上传到另一个服务。我只是想知道这种微服务是否有任何设计模式。谢谢你的回答,对象图表示是什么意思?