ruby-on-rails - 在控制器中使用渲染 json 时,动态生成的哈希键无法正确显示
问题描述
render json:
没有正确显示我的哈希键,我不确定为什么。我将在下面发布控制器代码和视图输出。
merger = {}
stops = OpsHeader.joins(
ops_stop_rec: :driver_header
)
.select(
:pb_net_rev,
:pbbname,
:ops_driver1,
:pb_id,
:ops_stop_id,
:dh_first_name,
:dh_last_name
)
.where(
:ops_stop_rec => {
ops_arrive_time: params[:startDate] .. params[:endDate]
})
OpsStopRec.joins(
:ops_line_items
).select(
:opl_amount,
:ops_type,
:ops_stop_id,
:ops_order_id,
:ops_driver1
)
.where(
:ops_stop_rec => {
ops_arrive_time: params[:startDate] .. params[:endDate]
}
).each do |lines|
stops.each do |stop|
if (lines.ops_stop_id == stop.ops_stop_id && lines.ops_driver1 == stop.ops_driver1)
merger[stop] = (merger[stop] ||= []) << lines
end
if (!merger.key?(stop))
merger[stop] = merger[stop]
end
end
end
render json: merger
这是我的实际输出render json:
:
#<OpsHeader:0x0a61cdd8>: [
{
ops_stop_id: 260772,
ops_order_id: "129215.0",
ops_type: "P",
ops_driver1: 97,
opl_amount: "625.0"
},
{
ops_stop_id: 260772,
ops_order_id: "129215.0",
ops_type: "P",
ops_driver1: 97,
opl_amount: "112.5"
}
],
如果我循环记录集合并将循环元素用作merger
哈希中的键,为什么它仍然无法在视图中正确显示?
奇怪的是values
,您看到的也来自循环collection
,但它们似乎正确显示。它将在视图中正确显示,binding.pry()
但不在视图中。
有任何想法吗?
让我给你一个更好的例子来说明我所指的是什么。这接近我想要的,但它仍然没有渲染到json
. 在这种情况下,我使用该attributes
方法来显示key
:
{"pb_id"=>0.133204e6, "pbbname"=>"AMARR INC", "pb_net_rev"=>0.24259e4, "ops_driver1"=>61, "ops_stop_id"=>268970, "dh_first_name"=>"MARK", "dh_last_name"=>"STAYTON"}: null,
{"pb_id"=>0.133203e6, "pbbname"=>"AMARR INC", "pb_net_rev"=>0.251647e4, "ops_driver1"=>89, "ops_stop_id"=>268966, "dh_first_name"=>"RICHARD", "dh_last_name"=>"STROEMER"}: null,
{"pb_id"=>0.133203e6, "pbbname"=>"AMARR INC", "pb_net_rev"=>0.251647e4, "ops_driver1"=>89, "ops_stop_id"=>268967, "dh_first_name"=>"RICHARD", "dh_last_name"=>"STROEMER"}: null,
{"pb_id"=>0.133203e6, "pbbname"=>"AMARR INC", "pb_net_rev"=>0.251647e4, "ops_driver1"=>89, "ops_stop_id"=>268968, "dh_first_name"=>"RICHARD", "dh_last_name"=>"STROEMER"}: null,
{"pb_id"=>0.133204e6, "pbbname"=>"AMARR INC", "pb_net_rev"=>0.24259e4, "ops_driver1"=>61, "ops_stop_id"=>268971, "dh_first_name"=>"MARK", "dh_last_name"=>"STAYTON"}: null,
{"pb_id"=>0.133204e6, "pbbname"=>"AMARR INC", "pb_net_rev"=>0.24259e4, "ops_driver1"=>61, "ops_stop_id"=>268972, "dh_first_name"=>"MARK", "dh_last_name"=>"STAYTON"}: null,
{"pb_id"=>0.133204e6, "pbbname"=>"AMARR INC", "pb_net_rev"=>0.24259e4, "ops_driver1"=>61, "ops_stop_id"=>268973, "dh_first_name"=>"MARK", "dh_last_name"=>"STAYTON"}: [
{
ops_stop_id: 268973,
ops_order_id: "133204.0",
ops_type: "P",
ops_driver1: 61,
opl_amount: "2375.9"
},
{
ops_stop_id: 268973,
ops_order_id: "133204.0",
ops_type: "P",
ops_driver1: 61,
opl_amount: "50.0"
},
{
ops_stop_id: 268973,
ops_order_id: "133204.0",
ops_type: "P",
ops_driver1: 61,
opl_amount: "0.0"
}
如您所见,有些是嵌套的,有些是有null
值的,这很好。
解决方案
所以在 JSON 格式中,一个键必须是一个字符串。只是 ruby 允许您拥有几乎任何东西作为哈希的键,但这并不意味着它将与 JSON 标准兼容。我会建议您更改数据的格式,以便您可以生成如下内容:
# It is JSON, not ruby
{
"ops_headers": [ # each of your OpsHeader instances
{
"pb_id": 133204,
"pbbname": "AMARR INC",
"pb_net_rev": 2425.9,
"ops_driver1": 61,
"ops_stop_id": 268970,
"dh_first_name": "MARK",
"dh_last_name": "STAYTON",
"ops_stop_recs": [ # contains array of their OpsStopRec instances
{
"ops_stop_id": 268973,
"ops_order_id": "133204.0",
"ops_type": "P",
"ops_driver1": 61,
"opl_amount": "2375.9"
},
{
"ops_stop_id": 268973,
"ops_order_id": "133204.0",
"ops_type": "P",
"ops_driver1": 61,
"opl_amount": "2375.9"
}
]
}
]
}
推荐阅读
- python - Python:如何在图中获得更平滑的起点?
- javascript - 试图从 WKWebView 中的 Javascript 获取信息(使用 KINWebBrowser)
- python - 如何同时写入多个 TCP 套接字?
- php - 如何提交切换数据以通过 Ajax 在我的 mysql 中更改布尔值的状态?
- mongodb - 无法将类型“PersistEntityBackend a0”与“MongoContext”匹配——通过 ObjectId 获取文档
- java - 在 Java 中不使用 XSLT 将 XML 属性转换为标签(节点)
- c++ - 使用初始化参数的模板类型
- javascript - 从 ReactJs 上的另一个组件触发组件方法
- github - 如何修复 GitHub 拉取请求上 sonarqube 评论的规则链接
- r - abline() 的问题