Хранение и получение OpenStruct из базы данных? - PullRequest
0 голосов
/ 31 марта 2012

В настоящее время я пытаюсь найти лучший способ для хранения и извлечения некоторых вложенных данных из базы данных в Rails 3. Я обращаюсь к API, и он возвращает данные и выводит их в формате OpenStruct. Некоторые данные находятся на одном уровне, и я анализирую их и сохраняю только значение в базе данных. Там нет проблем. Тем не менее, некоторые из возвращаемых предметов имеют сотни подпунктов, и я действительно не хочу вносить беспорядок в мои столы. Так что я до сих пор просто сохраняю все данные второго уровня или глубже непосредственно в базе данных.

Просто для примера, скажем, я получаю информацию об автомобиле, который храню в базе данных автомобилей. Таким образом, в основном make и model сохраняются в виде строк, но, скажем, поле для спецификаций, в котором все спецификации автомобилей вложены в него в OpenStruct. Поэтому вместо того, чтобы идти spec1 = car.specs.spec1, spec 2 = car.specs.spec2 ... specs100 = car.specs.spec100 и т. Д. Я делаю specs = car.specs и сохраняю это в базу данных. (Очень свободный пример, чтобы дать общее представление.)

Моя проблема заключается в получении этих данных. Обход данных больше не работает.

Если я пытаюсь вывести часть вложенной информации, я получаю «неопределенный метод».

Если я вывожу все поле, я получаю что-то вроде: "Спецификация автомобиля1: ---! Ruby / object: таблица OpenStruct:: spec2: Что-то здесь: spec3: Что-то здесь: spec4: Что-то здесь: spec5:! Ruby / объект: таблица OpenStruct: ... и т. д. "

Я довольно новичок в Rails, а также в формате OpenStruct, поэтому я был бы признателен за любую помощь в попытке получить данные. Или, возможно, лучший способ сохранить данные в первую очередь. Чего мне не хватает?

дб / schema.rb:

ActiveRecord::Schema.define(:version => 20120401042641) do

  create_table "characters", :force => true do |t|
    t.integer  "user_id"
    t.string   "realm"
    t.string   "name"
    t.integer  "level"
    t.integer  "race"
    t.integer  "class_id"
    t.integer  "gender"
    t.text     "guild"
    t.text     "talents"
    t.text     "items"
  end

  add_index "characters", ["user_id"], :name => "index_characters_on_user_id"

end

1 Ответ

3 голосов
/ 03 апреля 2012

После первого комментария от bradgonesurfing я решил попробовать сериализоваться с OpenStruct.По большей части работает так же, как с хэшами.

serialize :field (в моей модели)

Затем вы можете получить данные, позвонив по номеру field.something.something и т. Д.

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