2011-06-18 54 views
1

我在RoR中有一个游戏。游戏如此崩溃。有水平,水平有任务和任务有游戏(你试图完成任务)。从Ruby on Rails的循环中返回一个值

要通过关卡只需完成1个任务。所以在我的Level模型中,我试图编写方法来确定用户是否已经通过了关卡并且似乎无法获得它。如果游戏分数>通过任务所需的分数,我需要返回true。

这就是我所在的地方。如果我找到一个分数>任务得分的游戏玩法,我该如何退出循环并返回true?

def user_has_passed(user) 
    self.missions.each do |mi| 
     plays = Gameplay.where(:user_id => user.id, :mission_id => mi.id) 
     #code here, if a play.score > mi.score return true, else return false 
    end 
    end 

回答

3

为什么你不再增加一个部分到哪里?

good_plays = Gameplay.where(:user_id => user.id, :mission_id => mi.id).where("score > ?", mi.score) 

而与此,如果你得到任何戏剧(good.plays.size> 0)你是好

或与您查询,您还需要一个循环

plays.each do |play| 
    return true if play.score > mi.score 
    end 
+0

是的,一直在尝试的事情非常相似,但似乎总是变得虚假,必须在我的一端愚蠢 – brendan

+0

明白了,在我的self.missions - 你的good_plays行完美工作完成后,错过了“每个”,谢谢! – brendan

1
return play.score > mi.score 

这应该简明扼要地处理它。更冗长:

return play.score > mi.score ? true : false 

if play.score > mi.score 
    return true 
else 
    return false 
end 

注意,return不是严格必要的,因为最后计算的表达式是什么你的方法返回,但它有助于是明确的 - 至少在第一。

+0

这就是我想,但我只有一个戏剧收集,而不是一个单一的戏剧,当我试图循环播放它似乎总是返回假,看我的编辑 – brendan

0

你应该尝试any?

plays.any? { |play| play.score > mi.score }