Ruby on rails 在ruby中,如何将对象添加到数组中,为每个对象保留一个计数器,并且仍然可以轻松地检查对象是否在数组中?

Ruby on rails 在ruby中,如何将对象添加到数组中,为每个对象保留一个计数器,并且仍然可以轻松地检查对象是否在数组中?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我想整理一份推荐朋友的名单 我的想法是这样的这是半伪sudo代码 recommended_friends = [] friends.each do |friend| while recommeded_friends.length < 10 friend.friends.each do |friend| if friend.in?(recommeded_friends) recommeded_friends[friend][cou

我想整理一份推荐朋友的名单

我的想法是这样的这是半伪sudo代码

recommended_friends = []
friends.each do |friend|
   while recommeded_friends.length < 10
      friend.friends.each do |friend|
         if friend.in?(recommeded_friends)
             recommeded_friends[friend][counter] += 1
         else
             recommeded_friends << [friend, 0]
         end
      end
    end
end
用户1和用户2之间的友谊在数据库中只发生一次。

已更新。 尝试这样的方法,应该可以:

recommended_friends = {}
friends.each do |friend|
   if recommeded_friends.length < 10
      friend.friends.each do |other_friend|
         if other_friend != this_user          # exclude myself 
           recommeded_friends[other_friend] =
             (recommeded_friends[other_friend] | 0) + 1
         end
      end
   end
end
recommendend_friends.sort_by{|key, value| value}.reverse
top_ten = recommended_friends.first(10).map{|a| a[0]}
SQL版本:

Users.find_by_sql([
  "SELECT u.*
   FROM 
   (SELECT f2.id, f2.user_1_id u_1_id, f2.user_2_id u_2_id, (count(f1.id)) cnt
      FROM friendships f1 
      JOIN friendships f2 ON f1.user_1_id = f2.user_1_id
                          OR f1.user_2_id = f2.user_1_id
                          OR f1.user_2_id = f2.user_2_id
                          OR f1.user_1_id = f2.user_2_id
      WHERE (f1.user_1_id = ? OR f1.user_2_id = ?)
        AND (f2.user_1_id <> ? AND f2.user_2_id <> ?)
      GROUP BY f2.id, f2.user_1_id, f.user_2_id
      HAVING count(f2.id) = 1
      ORDER BY cnt DESC) fs
   JOIN friendships ff ON ff.user_1_id = fs.u_1_id
                       OR ff.user_2_id = fs.u_1_id
                       OR ff.user_2_id = fs.u_2_id
                       OR ff.user_1_id = fs.u_2_id
   JOIN users u ON 
     CASE WHEN (ff.user_1_id = fs.u_1_id OR ff.user_2_id = fs.u_1_id) 
                THEN fs.u_2_id ELSE fs.u_1_id END = u.id ", 
 user.id, user.id, user.id, user.id]).first(10)

从理论上讲,它应该可以工作,试试看。

推荐的朋友将始终保持空数组。 你不能这样做:推荐的朋友<10


试试这个:Recommed_friends.length<10

我能想到的最简单的方法:

 recommended_friends = friend.friends.sort do |a,b|
   a <=> b # insert your ranking algorithm here
 end.take 10

你缺少计数方法,朋友们推荐。计数你是说半伪码吗?@Andrewgrim哈哈是的,我当然知道。。。这是我在愤怒中打字@Stefano确保你在愤怒的时候不要使用sudo@Andrewgrim我会尽量记住这一点:我想要10个朋友,并根据他们有多少共同的朋友对他们进行排名。我知道数据库更适合这种类型的东西,但我不是数据库架构师。那么这个循环就不能正常工作了。我很快会写一个更好的解决方案。今天晚些时候我会尝试你的答案。但是你在DB做得更好是对的。但是,人们会怎么做呢?在这里和那里进行了一点连接之后,我的SQL知识已经用尽了。如果您提供一些表名,那么我可能会为您编写SQL。实际上,它只需要一些加入和分组。这样做,检查我的问题。对于我想象中懂一点SQL的人来说,这是非常直截了当的。
 recommended_friends = friend.friends.sort do |a,b|
   a <=> b # insert your ranking algorithm here
 end.take 10