Как я могу сохранить хэш в моей базе данных? - PullRequest
9 голосов
/ 11 января 2012

Существует ли метод Ruby или Activerecord, который может записывать и читать хэш в поле базы данных и из него?

Мне нужно написать веб-утилиту для приема данных POST и сохранения их в базе данных, затемпозже извлеките его из базы данных в исходном хеш-формате.Но в идеале, не зная, что это за структура.Другими словами, мое хранилище данных должно быть независимым от какого-либо конкретного набора ключей хеш-функции.

Например, один раз внешнее приложение может отправить POST в мое приложение:

"user" => "Bill",
"city" => "New York"

Но другоевремя, когда внешнее приложение может отправить POST в мое приложение:

"company" => "Foo Inc",
"telephone" => "555-5555"

Поэтому моя утилита должна сохранить произвольный хеш в поле text в базе данных, а затем воссоздать хеш из того, что было сохранено.

Ответы [ 5 ]

18 голосов
/ 15 января 2013

В Rails 4 добавлена ​​поддержка типа данных Postgres hstore, который позволит вам добавлять хэши непосредственно в вашу базу данных (postgres).

Если вы используете Rails 4 и Postgres, вы можете использовать hstore в своей миграции:

def up
  execute "create extension hstore"
  add_column :table, :column, :hstore
end

def down
  remove_column :table, :column
end

Эта команда выполнения включит hstore в Postgres, так что вам нужно сделать это только один раз.

Это позволит вам хранить хэш в :column точно так же, как и любой другой тип данных.

8 голосов
/ 11 января 2012

Есть два способа сделать это:

  1. Сериализировать ваш хэш и сохранить его в текстовом поле.
  2. Разделить хэш и сохранить каждый ключ в отдельной строке.

Проблема с первым подходом заключается в том, что поиск и манипулирование трудны и дороги.Например, префикс «0» перед тем, как телефонный номер всех сотрудников, работающих в Foo Inc., станет кошмаром по сравнению с хранением данных в обычном табличном формате.

Ваша схема будет:

employees (id, created_at, updated_at)
employee_details (id, employee_id, key, value)

Итак, для хранения

"company" => "Foo Inc",
"telephone" => "555-5555"

вы должны сделать:

employees: 1, 2012-01-01, 2012-01-01
employee_details (1, 1, "company", "Foo Inc"), (2, 1, "telephone", "555-5555")

Недостатки этого подхода: Rails изначально не поддерживает такую ​​схему.

5 голосов
/ 11 января 2012

Вы можете использовать сериализацию с 3 вариантами : маршал в двоичном формате, YAML и JSON удобочитаемые форматы хранилища данных.

Как только вы попробуете каждый из методов, не забудьте измерить время для сериализации и десериализации. Если вам нужно получить данные обратно в исходном формате, JSON является хорошим выбором для использования, потому что вам не нужно десериализовать их, а использовать как саму строку.

3 голосов
/ 11 января 2012

Вы ищете сериализация .Это поможет вам сделать именно то, что вы хотите.

1 голос
/ 18 апреля 2016

Rails 4 имеет новую функцию под названием Store , так что вы можете легко использовать ее для решения вашей проблемы.Вы можете определить метод доступа к нему, и рекомендуется объявить столбец базы данных, используемый для сериализованного хранилища, в виде текста, так что места достаточно.Пример оригинал :

class User < ActiveRecord::Base
  store :settings, accessors: [ :color, :homepage ], coder: JSON
end

u = User.new(color: 'black', homepage: '37signals.com')
u.color                          # Accessor stored attribute
u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor

# There is no difference between strings and symbols for accessing custom attributes
u.settings[:country]  # => 'Denmark'
u.settings['country'] # => 'Denmark'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...