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
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选项已经被投票了,所以我希望在那之后还有下一个选项,所以我不确定如何迭代这些选项。