NoMethodError de serialización en Ruby on Rails

Estoy tratando de crear una aplicación que tenga formularios, que tenga preguntas, que a su vez tenga respuestas. Las preguntas requieren un tipo diferente de respuesta, por ejemplo, texto libre o una elección de un conjunto de opciones posibles (pregunta de opción múltiple). Diferentes tipos de preguntas heredan de la clase base Pregunta. Son las preguntas de opción múltiple las que están resultando problemáticas.

Habrá preguntas de opción múltiple con diferentes conjuntos de posibles respuestas (digamos, 1-5, 1-8 o sí/no). Estaba pensando en crear una clase MultipleChoiceQuestion <Pregunta, y las opciones de respuesta se dan como una matriz y luego se guardan en la base de datos mediante serialización. Sin embargo, no puedo hacer que la serialización funcione en absoluto.

Al buscar en Google, tengo cifras de que la serialización debería funcionar escribiendo:

class MultipleChoiceQuestion < Question
    serialize :choices, Array
end

Ahora, si abro la consola de rieles y escribo

  q1 = MultipleChoiceQuestion.new
  q1.choices

Solo obtengo un NoMethodError en las opciones. ¿Hay algo más que deba hacer para que la serialización funcione? También intenté agregar una columna de texto "opciones" en la base de datos editando el archivo de migración y migrando la base de datos, pero tampoco ayuda.

Estoy usando Rails 3.2.6 y PostgreSQL 9.1.

Actualizar: Si cambio la clase MultipleChoiceQuestion para heredar de ActiveRecord::Base en lugar de Pregunta, la serialización funciona. Pero Question hereda de ActiveRecord::Base, por lo que no entiendo cuál es el problema.

preguntado el 27 de julio de 12 a las 16:07

Is Question extensión ActiveRecord::Base ? -

2 Respuestas

Normalmente hago algo como esto:

   class User < ActiveRecord::Base
 serialize :preferences, Hash
end

def preferences
 read_attribute(:preferences) || write_attribute(:preferences, {})
end

para asegurarse de que su valor predeterminado es el que esperaba. Y marco la columna de tipo de texto que se serializa para que el atributo se almacene como yaml.

user.preferences[:key]  = value

Respondido 27 Jul 12, 16:07

También puede agregar un nuevo modelo (y algunas tablas de base de datos) para las opciones, por ejemplo:

class Choice < ActiveRecord::Base
    belongs_to :multiple_choice_question
end

class MultipleChoiceQuestion < Question
    has_many :choices
end

Respondido 29 Jul 12, 13:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.