group_by education - rails 3

时间:2012-07-14 22:56:43

标签: ruby-on-rails ruby ruby-on-rails-3 facebook-graph-api activerecord

我正在使用Rails 3,omniauth和facebook graph api构建教育应用程序的原型。因此,当用户登录我的应用程序时,他使用他的Facebook帐户,我会抓住他所有的教育历史记录和他的朋友education_history。

我想将每个用户朋友的教育分组如下: enter image description here

我尝试过这样的事情:

<ul class="friends-list">
<%= current_user.friends.group_by(&:highschool_name) do |highschool_name| 
 p "<li>#{highschool_name}</li>"
 end
 %>
</ul>

我收到语法错误。

用户标签看起来像这样:

[id, name, image, location, highschool_name, highschool_year, college_name, college_year, graduteschool_name, graduate_year ]

而朋友的表格看起来像这样:

[id, uid, name, image, higschool_name, college_name, graduateschool_name, user_id]

如何解决我的问题使用活动记录,没有循环,因为它们没有效果..对吗?

1 个答案:

答案 0 :(得分:1)

您无法在ERB文件中使用pputs。将ERB文件视为连接在一起的一个大字符串。像"string 1" + "string 2" + "string 3"一样。

这就是所有ERB所做的 - 它只是将字符串粘贴到一个大字符串中。您无法在此连接操作中调用puts。所以ERB文件中的所有内容都需要是一个字符串。由于puts调用未返回字符串,因此puts调用的输出会“冒烟”,而是写入stdout

接下来我们查看group_by:它会返回Hash

---------------------------------------------------- Enumerable#group_by
     enum.group_by {| obj | block }  => a_hash
------------------------------------------------------------------------
     Returns a hash, which keys are evaluated result from the block,
     and values are arrays of elements in enum corresponding to the key.

        (1..6).group_by {|i| i%3}   #=> {0=>[3, 6], 1=>[1, 4], 2=>[2, 5]}

所以把所有东西放在一起我们可以做这样的事情:

<% current_user.friends.group_by(&:highschool_name).each do |hsname, friends| %>
   <% next if hsname.blank? %>
   <li><%= hsname %></li> 
   <% friends.each do |friend| %>
     <%= image_tag(friend.img_url) %> # <- Or wherever you get the img url from 
   <% end %>
<% end %>