2017-02-14 7 views
0

私はデータベースに保存されたハッシュの配列を持っています。日付はDateTime形式です。私の見解ではRuby - ハッシュの配列 - DateTimeキーから値を見つけよう

@item.yearly_interest_totals = [ 
    {"financial_year" => "Sun, 01 Jan 2017 00:00:00 +0000", "total" => "360"}, 
    {"financial_year" => "Mon, 01 Jan 2018 00:00:00 +0000", "total" => "240"}, 
    {"financial_year" => "Tue, 01 Jan 2019 00:00:00 +0000", "total" => "240"} 
] 

、私はfinancial_yearキーで対応する値を表示することができますどのように変数financial_year

で特定の会計年度がありますか? Iたとえば...

DateTimeオブジェクトに会計年度の整数を比較について少し混乱しています:

<tr> 
     <td>Financial Year: <%= financial_year.to_i %></td> 
     <td><%= @item.yearly_interest_totals.find{|i| i["financial_year"] == DateTime.new(financial_year.to_i,1,1)}["total"] %></td> 
</tr> 

これはと表示されるはずです:

会計年度:2017 360

FYI:Rails 5.0.0.1、Ruby 2.3.1、ローカルPostgres DB

答えて

0
financial_year = 2018 
yearly_interest_totals.map do |t| 
    t["total"] if Date.parse(t["financial_year"]).year == financial_year 
end.compact 
#⇒ ["240"] 

yearly_interest_totals.detect do |t| 
    Date.parse(t["financial_year"]).year == financial_year 
end["total"] 
#⇒ "240" 
0

想定すると、

financial_year = 2017 

あなたが行うことができます。

@items.yearly_interest_totals.each do |yit| 
    yit.merge!(DateTime.strptime(yit['financial_year'], "%a, %d %b %Y %H:%M:%S %z").year => yit['total']) 
end 
#=>[ 
# {"financial_year"=>"Sun, 01 Jan 2017 00:00:00 +0000", "total"=>"360", 2017=>"360"}, 
# {"financial_year"=>"Mon, 01 Jan 2018 00:00:00 +0000", "total"=>"240", 2018=>"240"}, 
# {"financial_year"=>"Tue, 01 Jan 2019 00:00:00 +0000", "total"=>"240", 2019=>"240"} 
# ] 

を今すぐあなたのビューで:私はあなたが金融年の別のループでこれを示していることを前提としてい

<tr> 
    <td>Financial Year: <%= financial_year %></td> 
    <td><%= @item.yearly_interest_totals.find{|yit| yit[financial_year] }[financial_year] %></td> 
</tr> 

注意を溶液の上に時間を作りますO(n2)の複雑さ。これは効率的なアプローチではありません。


我々はハッシュのハッシュにこの配列を変更することができる場合、それは大規模なデータセットのためのより良い仕事ができる:あなたのビューで今すぐ

yearly_interest_totals = @items.yearly_interest_totals.each_with_object({}) do |yit, obj| 
    obj[DateTime.strptime(yit['financial_year'], "%a, %d %b %Y %H:%M:%S %z").year] = yit 
end 
# => 
# { 
# 2017=>{"financial_year"=>"Sun, 01 Jan 2017 00:00:00 +0000", "total"=>"360"}, 
# 2018=>{"financial_year"=>"Mon, 01 Jan 2018 00:00:00 +0000", "total"=>"240"}, 
# 2019=>{"financial_year"=>"Tue, 01 Jan 2019 00:00:00 +0000", "total"=>"240"} 
# } 

<tr> 
    <td>Financial Year: <%= financial_year %></td> 
    <td><%= yearly_interest_totals[financial_year]['total'] %></td> 
</tr> 

あなたの場合1年間の複数の財務データを持っている場合は、配列としてyearly_interest_totalsハッシュの値を持つか、合計を更新することをお勧めします。

関連する問題