Я предлагаю создать метод toggleVote
, который принимает ключ элемента, за который вы хотите включить голосование, и ключ пользователя, делающего голосование.
Я бы также предложил добавить таблицу для записи голосов, в основном содержащую два поля:
"keyOfUserVoting", "keyOfItemBeingVotedOn"
Таким образом, вы можете просто выполнить запрос, в котором ключи совпадают, и если элемент существует, вы знаете, что пользователь проголосовал за этот элемент. (Query where keyOfUserVoting = 'param1' and keyOfItemVoted='param2'
, if result != None
, значит пользователь проголосовал)
Для метода toggleVote() случай может быть очень простым:
toggleVote(keyOfUserVoting, keyOfItemToVoteOn):
if (queryResultExists):
// delete this record from the 'votes' table
else:
// add record to the 'votes' table
Таким образом, вам никогда не придется беспокоиться об индивидуальном отслеживании того, сколько раз пользователь проголосовал или нет.
Таким же образом, если вы хотите узнать, сколько голосов подано за элемент, вы можете сделать еще один запрос, чтобы быстро count where keyOfItemToVoteOn = paramKeyOfItem
. Опять же, с GAE это будет очень быстро.
В этой настройке вы также можете быстро узнать, сколько раз пользователь проголосовал за один элемент (count where userKey = value and where itemKey = value
) или сколько раз пользователь проголосовал за всю систему (count where userKey = value
)...
Наконец, для большей надежности вы можете обернуть обновления в методе toggleVote()
в транзакцию, особенно если вы будете выполнять другие действия с пользователем или элементом, за который голосуют.
Надеюсь это поможет.
person
Cuga
schedule
19.07.2012