我正在整理一个小游戏,人们投票看到其他两个人基于他们之前输入的一些兴趣是一个很好的匹配,我无法让代码做我想做的事情。我们有一些关于他们“朋友”的数据,我想做以下事情:
我希望步骤1和2有点随机,所以他们每次都看不到朋友。我现在正在记录投票,所以我已经有了他们的投票清单。这是我到目前为止所做的,但无法弄清楚如何将两者放在一起。
found_new_match = false
#Try connected users first
# connected_users = current_user.get_connected_users
connected_users = []
unless connected_users.blank?
user = connected_users.shuffle.first
@match = user.matches.first
end
# Here i'd like to detect whether we got through all our connections' matches
while found_new_match == false do
found_new_match = true if @match = current_user.get_random_new_match
end
答案 0 :(得分:1)
假设您的代码的所有支持逻辑(获取连接的用户)正常工作,并且您的问题是如何将此逻辑折叠为一行,以下情况应该可以正常工作:
@match = current_user.get_connected_users.shuffle.first.try(:matches).try(:first) || current_user.get_random_new_match
如果您将“用户的第一场比赛”(user.matches.first
)计入其自己的存取方法,则可以跳过可怕的.try(:matches).try(:first)
。您可以进一步将“第一次随机匹配”纳入User
的便捷方法,以便代码进一步缩短为:
@match = current_user.get_random_connected_match || current_user.get_random_new_match
假设“get_random_connected_match”执行获取连接用户,拖拽选项以及从中提取第一个匹配的操作。重复重构广告。
答案 1 :(得分:0)
我接受了你的建议然后去了:
@match = current_user.get_random_connected_match || current_user.get_random_new_match
在我的方法中,我有:
connected_users = self.get_connected_users.map(&:id)
my_voted_matches = self.votes.map(&:matching_id)
Matching.first(:conditions => ["id NOT IN (?) AND (user_id IN (?) OR matched_id IN (?))", my_voted_matches.join(","), connected_users.join(","), connected_users.join(",")], :order => "RAND()")