yrr*_*ral 9 arrays activerecord json ruby-on-rails
我有一个模型历史(数据:文本),数据是序列化数组
我想将所有保存的历史渲染为json; 但是,当我需要将每个历史记录包含在单独的哈希中时,调用记录会强制它们成为1个数组.
我打电话的时候:
History.limit(1).pluck(:数据)
一切都很好,因为我得到1个数组:
[{"miners"=>{},
"stats"=>
{"amtDue"=>422770422,
"amtPaid"=>0,
"hash"=>18,
"identifier"=>"global",
"invalidShares"=>1,
"lastHash"=>1515350526,
"timeout"=>1515350582003,
"totalHashes"=>7107814,
"txnCount"=>0,
"validShares"=>9598},
"ticker"=>
{"base"=>"XMR",
"change"=>"-5.01749443",
"price"=>"396.34459617",
"target"=>"USD",
"volume"=>"24647.97760706"},
"timestamp"=>1515350523}]
Run Code Online (Sandbox Code Playgroud)
但是,当我调用2个或更多记录时,它们包含在1个数组中,这对我的需求无效:
History.limit(2).pluck(:数据)
[{"miners"=>{},
"stats"=>
{"amtDue"=>422770422,
"amtPaid"=>0,
"hash"=>18,
"identifier"=>"global",
"invalidShares"=>1,
"lastHash"=>1515350526,
"timeout"=>1515350582003,
"totalHashes"=>7107814,
"txnCount"=>0,
"validShares"=>9598},
"ticker"=>
{"base"=>"XMR",
"change"=>"-5.01749443",
"price"=>"396.34459617",
"target"=>"USD",
"volume"=>"24647.97760706"},
"timestamp"=>1515350523},
{"miners"=>{},
"stats"=>
{"amtDue"=>422770422,
"amtPaid"=>0,
"hash"=>4,
"identifier"=>"global",
"invalidShares"=>1,
"lastHash"=>1515353143,
"timeout"=>1515353179152,
"totalHashes"=>7125334,
"txnCount"=>0,
"validShares"=>9628},
"ticker"=>
{"base"=>"XMR",
"change"=>"3.74386788",
"price"=>"405.10595848",
"target"=>"USD",
"volume"=>"25292.54683583"},
"timestamp"=>1515353103}]
Run Code Online (Sandbox Code Playgroud)
如何在单独的哈希中获取每个历史记录的数据?这是我的控制器,我想将数组渲染为json:
def inquiry
@step = inquiry params[:step]
@n = inquiry_params[:n]
if @n.present?
@history = History.limit(@n).pluck[:data]
render :json => @history
else
....
end
def inquiry_params
accessible = [:step, :n]
params.permit(accessible)
end
Run Code Online (Sandbox Code Playgroud)
编辑:我现在打电话给:
@history = Hash [History.limit(@n).pluck(:data).flatten.map {| el | [el]}].展平
我得到了所需的格式; 然而,有一个不需要的"空",我不明白它来自何处或如何摆脱.
[{"miners"=>["b9aeff80-e16d-4af6-b675-9f218eff8077"],
"stats"=>
{"amtDue"=>422770422,
"amtPaid"=>0,
"hash"=>28,
"identifier"=>"global",
"invalidShares"=>1,
"lastHash"=>1515435268,
"timeout"=>1515435354059,
"totalHashes"=>9370026,
"txnCount"=>0,
"validShares"=>11999},
"ticker"=>
{"base"=>"XMR",
"change"=>"1.18426262",
"price"=>"383.96558958",
"target"=>"USD",
"volume"=>"24605.93213606"},
"timestamp"=>1515435302},
nil,
{"miners"=>["b9aeff80-e16d-4af6-b675-9f218eff8077"],
"stats"=>
{"amtDue"=>422770422,
"amtPaid"=>0,
"hash"=>28,
"identifier"=>"global",
"invalidShares"=>1,
"lastHash"=>1515435467,
"timeout"=>1515435505244,
"totalHashes"=>9374886,
"txnCount"=>0,
"validShares"=>12005},
"ticker"=>
{"base"=>"XMR",
"change"=>"0.52934940",
"price"=>"383.31067636",
"target"=>"USD",
"volume"=>"24591.95015563"},
"timestamp"=>1515435422},
nil]
Run Code Online (Sandbox Code Playgroud)
我不确定我是否理解正确,但可以使用这样的地图:
2.5.0 :001 > z = [ {:s=>{:a=>1, :b=>2}}, {:t=>{:c=>3, :d=>4}} ]
=> [{:s=>{:a=>1, :b=>2}}, {:t=>{:c=>3, :d=>4}}]
2.5.0 :002 > z.map{ |el| [el] }
=> [[{:s=>{:a=>1, :b=>2}}], [{:t=>{:c=>3, :d=>4}}]]
Run Code Online (Sandbox Code Playgroud)
在你的情况下应该是History.limit(2).pluck(:data).map{ |el| [el] }
编辑:通过调用紧凑,您将获得结果数组,其中所有nil值都被删除,如下所示:
2.5.0 :003 > x = [{a: {b: 1, c: 2}}, nil]
=> [{:a=>{:b=>1, :c=>2}}, nil]
2.5.0 :004 > x.compact
=> [{:a=>{:b=>1, :c=>2}}]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |