我的问题在某种程度上与我的应用问题有关,但答案在关联逻辑和记录时间戳的用例方面应该具有指导意义。
我有一个NBA选秀权游戏,我想要连续正确地选择x个游戏的奖章 - 10,20,30。
以下是正在使用的模型,属性和关联:
User
id
Pick
id
result # (values can be 'W', 'L', 'T', or nil. nil means hasn't resolved yet.)
resolved # (values can be true, false, or nil.)
game_time
created_at
*注意:有些情况下,选择结果字段和已解析字段始终为零。也许游戏被取消了。
Badge
id
Award
id
user_id
badge_id
created_at
此处捕获代码的一个重要规则是,虽然用户可以获得多个条纹徽章(例如,用户可以赢得多个10条纹徽章),但用户不能再获得连续徽章以前获得奖励徽章的获奖选秀权。 想到这一点的一种方法是,获胜选秀权的所有日期必须在获得条纹徽章的日期之后。例如,让我们假设一个用户在5月5日到5月8日期间获得了13个中奖选秀权,其中第10个获胜选秀权发生在5月7日,最后3个选秀权发生在5月8日。用户将在5月7日获得10连胜徽章现在,如果用户在5月9日再次获胜,则代码必须认识到用户只有4个获胜选秀,而不是14个,因为用户已经获得了前10名的奖励。
现在让我们假设用户再获得6个中奖选秀权。在这种情况下,代码必须认识到自5月5日以来所有获奖选秀权都有资格获得20连胜徽章奖,并获得奖励。
另一个重要规则是,在看连胜时,我们并不关心比赛时间,而是关注选秀权(created_at)。例如,假设A队在Sun上扮演B队。 C队在周六参加D队。如果用户选择C队在周四击败D队,A队在周五击败B队,C队在周六获胜,但A队输给Sun,那么用户的连胜纪录为1.C队是先挑选。
那么什么时候必须进行连线检查?只要一个选择是一个胜利。如果这是一个损失或平局,检查没有意义。
还有一点需要注意:如果选秀权未得到解决(错误)且结果为零,则意味着游戏被推迟,必须将其考虑在内。
总而言之,确定用户是否有10年,20年或30连胜的最有效,最有效和最精益的方法是什么?
答案 0 :(得分:1)
我创建了一个条纹模型,一个用户has_one条纹,有3列:
ID
USER_ID
consecutive_wins整数默认为0
OR
我将consecutive_wins列添加到User。
然后,每次下注结算,如果不是推送,请更新consecutive_wins。
如果丢失,则continuous_wins重置为0
如果是胜利,则continuous_wins增加1.
如果它是一个胜利,以这种方式授予徽章(ruby'esque伪代码):
badge = 10
while badge < max_badge_size do
if consecutive_wins < badge then
break
end
if (consecutive_wins % badge == 0) then
# Award the badge here
end
badge += 10
end
这个简单的代码似乎涵盖了你的例子。在连胜2场比赛的胜利中,没有任何奖励。在10连胜的10连胜中,徽章10被授予,但不是徽章20.在连胜40的胜利中,它将奖励10徽章,20徽章和40徽章,但不是30或50徽章。在连胜41场比赛中,它不会奖励任何东西。