2013-03-14 1 views
0

Извинения за уродливый код (в дополнение к нему не работает).сохранение и обновление на сериализованной колонке

У меня есть приложение 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}) 
+1

Любая конкретная причина, по которой вы храните массив CSVd в одном столбце вместо использования традиционной таблицы ассоциаций? –

+0

@muistooshort это была первая и единственная идея, которая пришла мне в голову. Если у вас есть время, можете ли вы предложить, как я могу настроить таблицу ассоциаций, имея в виду, что нет модели quiz.rb. – BrainLikeADullPencil

+0

Вы должны начать с определения модели викторины (лучше, чем позже). Тогда у вас будет таблица '(person_id, quiz_id) с уникальным индексом on on (person_id, quiz_id)', чтобы отслеживать, кто из них выполнил эту викторину. –

ответ

1

Во-первых, я хотел бы хранить значения в базе данных "2","4","6", а не как ["2","4","6"]. [ и ] не нужны.

Я бы использовал String#split, чтобы преобразовать строку в базу данных в массив, который может использоваться в коде. Я бы использовал Array#join для преобразования массива, используемого в коде, в строку для хранения в базе данных.

quiz = player.quiz? ? player.quiz.split(",") : [] 
alreadyplayedthisquiz = quiz.include? user.id.to_s 
if (!alreadyplayedthisquiz) 
    quiz.push user.id.to_s 
    player.update_attributes({:quiz => quiz.join(",")}) 
end 
+0

метод serialize: quiz в пользовательской модели помещает несколько строк в массив. так ли ваше решение означает, что я не нуждаюсь в этом, я думаю? – BrainLikeADullPencil

+0

Хорошо, я попробовал это с сериализацией и без нее: викторину, и она работает в обоих направлениях. Большое спасибо. – BrainLikeADullPencil

Смежные вопросы