Ruby on rails 在ruby中,如何将对象添加到数组中,为每个对象保留一个计数器,并且仍然可以轻松地检查对象是否在数组中?
我想整理一份推荐朋友的名单 我的想法是这样的这是半伪sudo代码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
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