Rails迭代与一些聪明

时间:2011-02-06 14:29:54

标签: ruby-on-rails ruby algorithm

我正在整理一个小游戏,人们投票看到其他两个人基于他们之前输入的一些兴趣是一个很好的匹配,我无法让代码做我想做的事情。我们有一些关于他们“朋友”的数据,我想做以下事情:

  1. 选择其中一个“朋友”
  2. 查找该朋友的匹配
  3. 如果我找不到我之前投票的任何朋友的比赛,请随机进行比赛
  4. 我希望步骤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
    

2 个答案:

答案 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()")