在控制器中使用render 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"
}
]
}
]
}

最新更新