How do I iterate over an array of nested hashes in a view?
I have an array that has nested hashes of months, years and amounts that I want to diplay in a table. My data is in this format:
[{:month=>"January", :years=>{2017=>20, 2018=>100, 2019=>300}}, {:month=>"February", :years=>{2017=>30, 2018=>40, 2019=>80}}]
I want to display it in a table that looks like this:
Month 2017 2018 2019
January
February
March...
I am a beginner and am really struggling to access the values for the invidual years.
Thanks in advance!
Hi Premila,
In your views controller, you'll want to do something like:
def index # or whatever method you're working with
@array = [{:month=>"January", :years=>{2017=>20, 2018=>100, 2019=>300}}, {:month=>"February",
:years=>{2017=>30, 2018=>40, 2019=>80}}]
end
then in your view, you'll do something like:
<% @array.each do |item| %>
<ul>
<li><%= item[:month] %> <%= item[:years] %></li>
</ul>
<% end %>
Oh wait, are you needing them to be like this:
| Month | 2017 | 2018 | 2019 |
| --- | --- | --- | --- |
| January | 20 | 100 | 300 |
| February | 30 | 40 | 80 |
Ah boo, markdown isn't parsing the table - either way I think you see what I mean... lol 1 moment let me re-work with the table method in mind.
Yes, that's the table I'm trying to make! I'm able to display the months, but I get stuck with the years and values. Thank you for your help!
Here you go - trick is to remember that even though it's nested, it can still be iterated over inside another iteration... it helps to use byebug, so when I got to the part of getting the year values to display, I just placed <% byebug %>
right below <% item[:years].each do |year| %>
so I could then see how the objects are being presented and adjust as necessary.
<table>
<tr>
<th>Month</th>
<th>2017</th>
<th>2018</th>
<th>2019</th>
</tr>
<% @array.each do |item| %>
<tr>
<td><%= item[:month] %></td>
<% item[:years].each do |year| %>
<td><%= year[1] %></td>
<% end %>
</tr>
<% end %>
</table>
I was making it much harder. Good point on using byebug. I should have done that. Thank you for your help!!