簡體   English   中英

在ruby中,如何將對象添加到數組中,為每個對象保留一個計數器,並且仍然輕松檢查對象是否在數組中?

[英]in ruby how do I add objects to an array, keep a counter for every object and still check easily if the object is in the array?

我想編制一份推薦朋友名單。

我在想的是這樣的東西(這是半偽(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

但這顯然不起作用。 你們將如何處理呢?

感謝您的任何建議。

表(有些被縮短):

Users:
id | name 

Friendships
id | user_1_id | user_2_id | requested_at | accepted_at | declined_at |

user1和user2之間的友誼僅在DB中發生一次。

更新。 嘗試這樣的事情,它應該可以工作:

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)

從理論上講,它應該起作用,嘗試一下。

recommeded_friends將始終保持為空數組。 您不能這樣做:recommeded_friends <10

試試這個:recommeded_friends.length <10

我能想到的最簡單的方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM