【问题标题】:Array Logic in Rails (via JSON)Rails 中的数组逻辑(通过 JSON)
【发布时间】:2011-11-27 16:20:44
【问题描述】:

我有一个正在解析的 JSON 提要。以下是以下代码示例:

JSON

[
   {
      "global_event":{
         "ending_at":"2011-11-07T02:00:00Z",
         "short_url":"http://bit.ly/reAhRw",
         "created_at":"2011-10-04T14:25:41Z",
         "event_responses":[

         ],
         "addresses":{
            "location":{
               "city":"blah",
               "latitude":30.205288,
               "zipcode":"343434",
               "street":"blah",
               "longitude":-95.475289,
               "state":"TX"
            }
         },
         "body":"blahblahblah",
         "euid":"2f489d0c82d167f1c16aba5d3b4c29ade6f1d52a",
         "title":"Fusion",
         "updated_at":"2011-10-04T14:26:57Z",
         "event_roles":[

         ],
         "user":{
            "long_name":"Fusion Single",
            "nickname":""
         },
         "event_items":[

         ],
         "starting_at":"2011-11-07T00:00:00Z"
      }
   }
]

控制器

def events
    @json = ActiveSupport::JSON.decode(open('jsonfeed').read)
end

查看

<ul class="events">
    <% @json.each do |event| %>
        <% event.each do |e, d| %>
            <li>
                <h4><%= d['starting_at'].to_date.strftime('%A') %></h4>
                    <small><%= d['starting_at'].to_date.strftime('%b %d') %></small>
                    <p>
                        <%= link_to d['title'], d['short_url'] %> <span style="font-size: 12px; padding: 0 10px; font-weight: bold;">|</span> 
                        <%= d['starting_at'].to_date.strftime('%I:%M %p') %>
                    </p>
            </li>
        <% end %>
    <% end %>
</ul>

最后,所有这些都已到位,它运行良好。这是我的输出的样子:

所以,最后是我的问题:正如您在屏幕截图中看到的,打印到屏幕上的两个项目具有相同的日期(1 月 14 日)。我想做的是将两者结合起来。因此,我的最终输出将是“星期六”,下面列出了两个事件。感谢您的帮助!

【问题讨论】:

标签: ruby-on-rails arrays ruby-on-rails-3 json


【解决方案1】:

以下代码可以帮助您按日期对事件进行分组:

控制器

def events
    @json = ActiveSupport::JSON.decode(open('jsonfeed').read).group_by {|e| e["global_event"]["starting_at"].to_date.strftime('%Y-%m-%d') }
end

生成的数据结构:

{"2011-11-07"=>
  [{"global_event"=>
     {
      "ending_at"=>"2011-11-07T02:00:00Z",
      "short_url"=>"http://bit.ly/reAhRw",
      "created_at"=>"2011-10-04T14:25:41Z",
      "event_responses"=>[],
      "addresses"=>
       {"location"=>
         {"city"=>"blah",
          "latitude"=>30.205288,
          "zipcode"=>"343434",
          "street"=>"blah",
          "longitude"=>-95.475289,
          "state"=>"TX"
         }
       },
      "body"=>"blahblahblah",
      "euid"=>"2f489d0c82d167f1c16aba5d3b4c29ade6f1d52a",
      "title"=>"Fusion",
      "updated_at"=>"2011-10-04T14:26:57Z",
      "event_roles"=>[],
      "user"=>{"long_name"=>"Fusion Single", "nickname"=>""},
      "event_items"=>[],
      "starting_at"=>"2011-11-07T00:00:00Z"
     }
  }]
}

查看

<ul class="events">
    <% @json.each do |date, events| %>
        <li>
            <h4><%= date.to_date.strftime('%A') %></h4>
            <small><%= date.to_date.strftime('%b %d') %></small>
                <% events.each do |e| %>
                    <p>
                        <%= link_to e['global_event']['title'], e['global_event']['short_url'] %> <span style="font-size: 12px; padding: 0 10px; font-weight: bold;">|</span> 
                        <%= e['global_event']['starting_at'].to_date.strftime('%I:%M %p') %>
                    </p>
                <% end %>
        </li>
    <% end %>
</ul>

【讨论】:

  • 感谢您的代码,但它实际上打印出所有内容的方式与我的代码打印出来的方式相同 O.o
  • @johnernaut 不应该是这样,你能在你的 JSON 事件中添加更多事件吗?我可能在那里做了错误的假设。
  • 嗨,Benoit,我在做了一段时间的其他事情后回到这个项目,发现你的答案实际上是正确的。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2020-01-03
相关资源
最近更新 更多