![](/img/trans.png)
[英]How can I check if an object with specific property exists in a Ruby array
[英]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.