ActiveRecord Logic Challenge - умные способы использовать метку времени AR - PullRequest
2 голосов
/ 20 мая 2010

Мой вопрос несколько специфичен для проблемы моего приложения, но ответ должен быть поучительным с точки зрения случаев использования логики ассоциации и отметки времени записи.

У меня есть игра 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 побед?

1 Ответ

1 голос
/ 23 мая 2010

Я бы создал модель штрихов, полоса пользователя has_one, с 3 столбцами:

idИдентификатор пользователяцелое число по умолчанию: 0

ИЛИ

Я бы добавил столбец последовательность_вин к Пользователю.

Затем, каждый раз, когда ставка разрешается, если она не является толчком, обновляет coecutive_wins.

Если это проигрыш, coecutive_wins сбрасывается в 0.Если это выигрыш, значениеручное_производство увеличивается на 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 серии он ничего не даст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...