ActiveRecord逻辑挑战 - 使用AR时间戳的智能方法

时间:2010-05-19 23:44:46

标签: ruby-on-rails activerecord logic

我的问题在某种程度上与我的应用问题有关,但答案在关联逻辑和记录时间戳的用例方面应该具有指导意义。

我有一个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
  • 用户有很多奖项。
  • 用户有很多选择。
  • Pick属于用户。
  • 徽章有很多奖项。
  • 奖励属于用户。
  • 奖项属于徽章。

此处捕获代码的一个重要规则是,虽然用户可以获得多个条纹徽章(例如,用户可以赢得多个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连胜的最有效,最有效和最精益的方法是什么?

1 个答案:

答案 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场比赛中,它不会奖励任何东西。