如何从数据库中提取或选择值,并为rails中的每个记录返回单独的数组

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)

And*_*eis 1

我不确定我是否理解正确,但可以使用这样的地图:

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)