qweewq
@qweewq
ruby, ruby on rails, devops

Как лучше сохранить Hash расположения объектов в БД?

Могу ли я создать модель, которая будет, например, в одном поле хранить такую структуру:

{1 => { "x" => 100, "y" => 200}, 2 => { "x" => 420, "y" => 300 }}




Хотелось бы, чтобы эта сущность к тому же могла эти объекты находить, подобно has_many.



Я ещё не встречал подобных решений — не хватает опыта.
  • Вопрос задан
  • 3627 просмотров
Пригласить эксперта
Ответы на вопрос 3
mshakhan
@mshakhan
Немного не понял вопроса. Если просто хранить в поле хэш, то есть serialize:

class User < ActiveRecord::Base
  serialize :preferences
end

user = User.create(:preferences => { "background" => "black", "display" => large })
User.find(user.id).preferences # => { "background" => "black", "display" => large }
Ответ написан
Комментировать
mercurial
@mercurial
Чтобы хранить подобные модели лучше использовать NoSQL решения, типа таких как MongoDB или CoachDB, при правильном использовании — Redis тоже хороший вариант.
В случае с PostgreSQL можно так же использовать относительно новую фичу hstore.
Во первых нужно будет перевести метод миграций на sql, так как hstore является колонкой специфичного формата.
Сделать это можно в конфиг-файле application.rb Вашего приложения:
config.active_record.schema_format = :sql

После чего добавьте gem activerecord-postgres-hstore в Gemfile Вашего приложения, и сгенерите hstore:setup:
$ rails g hstore:setup

Эта миграция включит расширение hstore для вашей базы данных.

И вуаля! hstore теперь можно юзать в генерации миграций Ваших таблиц:
$ rails g migration add_properties_to_table properties:hstore

Кроме того что колонки типа hstore работают так же как сериализуемые строки, их можно использовать при выборке (select) и даже сделать индексируемыми для более быстрого поиска. Вобщем за подробностями обращайтесь к документации (ссылки приведены выше).
Ответ написан
Комментировать
@Otkrick
dht не подходит?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы