通过Ruby中的复杂哈希数组进行排序

时间:2015-12-07 18:46:25

标签: ruby-on-rails spotify

已更新

我正在使用Spotify api根据用户在我的网站上关注的艺术家获取有关相关艺术家的信息。我想知道,为了以某种方式显示事物,我怎样才能对我得到的反应进行排序。

对于我网站上关注的每位艺术家,我想按照从最大到最低的关注者对相关艺术家的回应进行排序。如果我网站上的用户关注的是超过1位艺术家,我希望相关艺术家信息的完整回复由关注者订购。例如,如果我网站上的某人关注了Metallica和Oasis,我希望Metallica和Oasis的相关艺术家可以跟随者订购。现在,如果用户只关注一位艺术家,我的代码只能以我想要的方式正常工作。

我该怎么做呢?我也不希望在我的回复中有任何重复的艺术家,因为有时某些艺术家会有相同的相关艺术家。

当我在我的网站(Metallica和Oasis)上关注2位艺术家时,我得到相关艺术家的回复。不得不把它放在一个要点上,因为这里的反应很大。

https://gist.github.com/jlquaccia/07998975d3f11324ab0d

Controller - users_controller.rb:

   def show
    @user = User.find(params[:id])
    @hash_version_array = []

    @user.follows.each do |follow|
      response = HTTParty.get("https://api.spotify.com/v1/artists/#{follow.artist_id}/related-artists")
      @hash_version = JSON.parse(response.body)
      @artist_name = follow.artist_name

      @hash_version_array << @hash_version
    end

    sorted = @hash_version_array.first["artists"].sort_by { |a| a["followers"]["total"] }
    @most_to_least_followers_version_array = sorted.reverse
  end

查看 - users / show.html.erb:

    <div class="row">
     <div class="col-md-12 text-center">
      <h3>Recommendations</h3>
      <% if current_user.follows.count == 0 %>
        <p>Recommendations based on who you follow will appear here..</p>
      <% else %>
        <p>Based on your follows you might also like..</p>
        <% @most_to_least_followers_version_array.each do |item| %>
          <div class="artist_recommendation_wrapper">
            <div class="artist_recommendation artist_name newsfeed_artist">
              <%= item['name'] %>
            </div>
            <%= number_with_delimiter(item['followers']['total'], delimiter: ',') %> followers
            <%= link_to(image_tag(item['images'][0]['url'], class: 'img-responsive artist_recommendation_img', width: 200, height: 200), artists_path) rescue image_tag("microphone.png", class: 'img-responsive artist_img mic_bg', width: 200, height: 200) %>
            <br>
          </div>
        <% end %>
      <% end %>
    </div>
  </div>

2 个答案:

答案 0 :(得分:1)

对于散列,你可以做到这一点:

hash.first["artists"].sort { |a| a["followers"]["total"] }

hash包含解析的JSON响应时。

答案 1 :(得分:0)

您需要创建一个包含所有后续艺术家的数组。改变这一行:

  @hash_version_array << @hash_version

  @hash_version_array << @hash_version["artists"]

并按

排序
@hash_version_array.sort { |a| a["followers"]["total"] }

顺便说一句:你不需要所有这些变量都是全局的(用'@'表示)。这应保留在模板中所需的数据中。将这样的东西放入模型中可能也是一个好主意,并且可能将Spotify API响应写入数据库 - 这样您可以使用ActiveRecord及其所有魔法。

在此处提问时,您还应尝试尽可能多地抽象出信息。 I. e。数据来自spotify API并不是真正相关的,你可以通过使用较小的数据集来简化你的生活和这个问题。