Мой вопрос несколько специфичен для проблемы моего приложения, но ответ должен быть поучительным с точки зрения случаев использования логики ассоциации и отметки времени записи.
У меня есть игра 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 полос), пользователь НЕ МОЖЕТ получить еще один значок подряд победные награды, которые ранее были отмечены значком.
Один из способов думать об этом состоит в том, что все даты победных выборов должны следовать за датой, когда был вручен значок полосы. Например, давайте представим, что пользователь сделал 13 выигрышных пиков с 5 по 8 мая, при этом 10-й выигрышный пика произошел 7 мая, а последние 3 - 8 мая. Пользователь получит 10-полосный значок 7 мая. Теперь, если пользователь делает еще один выигрышный выбор 9 мая, код должен признать, что у пользователя есть только 4 выигрышных выбора, а не 14, потому что пользователь уже получил вознаграждение за первые 10.
Теперь давайте предположим, что пользователь делает еще 6 выигрышных пиков. В этом случае в коде должно быть указано, что все выигрышные пики, начиная с 5 мая, могут быть награждены 20-значным нагрудным значком, и присуждать награду.
Другое важное правило заключается в том, что при рассмотрении выигрышной серии нам не важно время игры, а время выбора (созданный_ат). Например, скажем, команда А играет команду Б на Sun. И команда C играет команду D в субботу. Если пользователь выбирает команду C для победы над командой D в четверг, а команду A для победы над командой B в пятницу и команда C выигрывает в субботу, а команда A проигрывает в Sun, то у пользователя есть победная серия 1. Команда C была выбрал первым.
Так, когда должен включиться контроль полосы? Как только выбор - победа. Если это потеря или ничья, нет смысла проверять.
Еще одно замечание: если выбор не разрешен (ложно), а результат равен нулю, это означает, что игра была отложена и должна быть исключена.
С учетом всего вышесказанного, какой самый эффективный, действенный и эффективный способ определить, имеет ли пользователь серию из 10, 20 или 30 побед?