Ruby on rails Rails迭代具有一定的智能性

Ruby on rails Rails迭代具有一定的智能性,ruby-on-rails,ruby,algorithm,Ruby On Rails,Ruby,Algorithm,我正在制作一个小游戏,人们根据之前输入的一些兴趣,投票看另外两个人是否是很好的搭档,我很难让代码实现我想要的。我们有一些关于他们“朋友”的数据,我想做以下工作: 选择他们的一个“朋友” 找到那个朋友的一对 如果我找不到我以前投票的任何朋友的匹配项,请随机进行匹配 我希望第1步和第2步是随机的,这样他们就不会每次都看到朋友了。我现在正在记录投票,所以我已经有了他们的投票名单。这是我到目前为止所拥有的,但我不知道如何将两者结合起来 found_new_match = false #Try conn

我正在制作一个小游戏,人们根据之前输入的一些兴趣,投票看另外两个人是否是很好的搭档,我很难让代码实现我想要的。我们有一些关于他们“朋友”的数据,我想做以下工作:

  • 选择他们的一个“朋友”
  • 找到那个朋友的一对
  • 如果我找不到我以前投票的任何朋友的匹配项,请随机进行匹配
  • 我希望第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
    

    假设您的代码的所有支持逻辑(获取连接的用户)都正常工作,并且您的问题是如何将此逻辑折叠成一行,那么以下操作应该可以正常工作:

      @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)
    。您可以进一步将“第一个随机匹配”因素化为
    用户
    上的一个方便方法,这样代码将进一步缩短为:

      @match = current_user.get_random_connected_match || current_user.get_random_new_match
    

    假设“get_random_connected_match”执行获取连接用户、洗牌出一个选项并从中提取第一个匹配项的操作。重复重构的过程。

    我接受了你的建议,选择了:

    @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()")
    

    谢谢我之所以提出.first最初是因为我只是想得到一个结果,但很可能.first选项已经被投票了,所以我希望在那之后还有下一个选项,所以我不确定如何迭代这些选项。