Извинения за уродливый код (в дополнение к нему не работает).сохранение и обновление на сериализованной колонке
У меня есть приложение Rails, в котором есть много пользователей, которые играют в разные викторины, которые были созданы различными пользователями. Между пользователем и викторинами нет связи между рельсами, за исключением того, что каждая викторина была сделана конкретным пользователем. На самом деле в приложении нет даже «викторины» (викторины сделаны из моделей вопросов и ответов).
По понятным причинам пользователям разрешается только попробовать каждую викторину; поэтому я должен записывать, какие пользовательские quizer, которые пользователь пытался. Поэтому я создал атрибут «викторины» в пользовательской модели и сериализовал его, так что я бы надеялся иметь столбец базы данных, подобный этому ['2','4','10']
, если бы я сыграл викторины, которые были сделаны пользователями с идентификаторами 2,4 и 10.
в модели пользователя, после создания: викторины, как «строка», я сделал это, чтобы превратить строку в массив в БД
attr_accessible :quiz
serialize :quiz
Однако, у меня много проблем написания кода что делает все из следующих
a) проверяет, не находится ли этот столбец (возможно, игрок еще не сыграл викторину): я сделал player.quiz?
, чтобы проверить это.
б) проверка, содержит ли массив определенный user.id (то есть, если игрок уже играл, что викторина) я player.quiz.include?(user.id.to_s)
, чтобы проверить, что
с) создание первой записи, если пользователь не играл любые викторины пока. Я сделал quiz = user.id.to_s
d) добавление к массиву об игре, когда пользователь сыграл второй пользователь игры (колонка викторины есть игрок является [ «2»], и теперь они играют викторину по user.id 4.
С различные комбинации кода ниже, я продолжаю стирать/перезапускать столбец викторины при попытке обновления, или я создаю строки типа «68», когда я хочу ['6', '8'].
I Буду признателен, если вы можете дать мне несколько советов, чтобы исправить это.
код не работает
if player && player.quiz? && player.quiz.include?(user.id.to_s) #checks if signed in (if player), if the player.quiz column isn't empty, and if it includes a user id
alreadyplayedthisquiz = true
else
if player.quiz? #it might be that no quizzes are registered on db
quiz = player.quiz #this is a string
quiz.push(user.id.to_s) #can't push onto a string
quiz += user.id.to_s #this is wrong, because if I've played quiz 6 and 8, it'll be '68' in the db
else
quiz = user.id.to_s #if no quiz on player's db, create first one
end
alreadyplayedthisquiz = false
end
player.update_attributes({quiz: quiz})
Любая конкретная причина, по которой вы храните массив CSVd в одном столбце вместо использования традиционной таблицы ассоциаций? –
@muistooshort это была первая и единственная идея, которая пришла мне в голову. Если у вас есть время, можете ли вы предложить, как я могу настроить таблицу ассоциаций, имея в виду, что нет модели quiz.rb. – BrainLikeADullPencil
Вы должны начать с определения модели викторины (лучше, чем позже). Тогда у вас будет таблица '(person_id, quiz_id) с уникальным индексом on on (person_id, quiz_id)', чтобы отслеживать, кто из них выполнил эту викторину. –