эффективно хранить «ответы» - PullRequest
1 голос
/ 28 октября 2009

Я создаю класс ответа ActiveRecord, который может иметь разные типы ответов. То есть ответом может быть целое число, число с плавающей запятой, дата, строка ... что угодно ...

На мой взгляд, есть два способа хранения ответов

1)

Иметь атрибут с именем "value", который сериализуется.

Это хорошо, так как вы всегда можете получить доступ к ответу из того же места. Вероятно, это отстой для поиска ответов, так как данные должны быть десериализованы, чтобы их можно было использовать (это правильное предположение?)

2)

имеет несколько атрибутов integerValue, floatValue и т. Д. *

Это проще всего искать (если вы знаете, какой тип вы ищете (что вы, вероятно, делаете))

Это отстой, так как значение не в том же месте и нуждается в некотором хоккейном методе, таком как:

def value
  stringValue||floatValue||integerValue
end

и некоторые проверки, чтобы убедиться, что установлена ​​только правильная

Что бы вы сделали ??

Ответы [ 2 ]

2 голосов
/ 29 октября 2009

Я бы сделал одну из двух вещей:

  1. Использовать наследование одной таблицы. Ваша таблица содержит эти поля integerValue, floatValue и т. Д .; но оно также содержит поле типа, и вы создадите подкласс модели ответа, чтобы сделать IntegerAnswer, FloatAnswer, StringAnswer и т. д. А затем вы можете просто сопоставить метод доступа value с one из этих полей в каждом подклассе. Посмотрите в книге Agile или Google о наследовании одной таблицы в Rails, чтобы узнать больше о том, как реализовать это.
  2. Использовать нереляционную базу данных. Что-то вроде MongoDB или CouchDB сделал бы эту проблему спорного; Вы можете сделать значение что угодно, или иметь несколько значений в ответе, или пропустить его полностью. Мне лично нравится Монго с гемом MongoMapper , и если бы мне пришлось обратиться к вашему варианту использования, я бы пошел в этом направлении. Тем не менее, он уходит от ActiveRecord и «мейнстримных» Rails, поэтому вам, возможно, будет удобно жить хотя бы немного на грани.
1 голос
/ 28 октября 2009

Что преобразовывает значение в строку в базе данных. И использование наследования одной таблицы для определения типа и получения соответствующего значения.

У вас будет один ответ модели с двумя полями: одно значение, представляющее собой строку.
И один «тип», который тоже является строкой и получает тип значения.

Тогда для поплавка у вас есть следующее:

class FloatAnswer < Answer
    def value
        attributes['value'].to_f
    end
end

Когда вы делаете Answer.find(:all), если элемент имеет значение FloatAnswer, у вас будет объект FloatAnswer. Не Ответ один.

Таким образом, вы сохраняете только одно поле базы данных и всегда имеете данные в соответствующем формате.

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