2010-06-06 4 views
1

В настоящее время я работаю над приложением Ruby on Rails, которое будет функционировать в некотором роде как сайт для социальных сетей. В рамках этого каждый пользователь на сайте будет иметь профиль, в котором они могут заполнить свою контактную информацию (номера телефонов, адреса, адреса электронной почты, работодателя и т. Д.).Хранение произвольной контактной информации в Ruby on Rails

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

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

В идеале, я хотел бы использовать vCard как мой формат сериализации. vCards - это стандартное решение для хранения контактной информации в Интернете, а повторное использование протестированных решений - это хорошая вещь. Альтернативные форматы сериализации включают в себя просто маршалинг рубинового хэша или YAML. Независимо от формата сериализации, поддержка чтения и обновления этой информации в виде рельсов, похоже, является основной проблемой реализации.

Итак, вот вопрос: Кто-нибудь видел этот подход, используемый в приложении для рельсов? Существуют ли какие-либо плагины или драгоценные камни, которые делают такую ​​систему простой в использовании?

В идеале, я бы хотел, чтобы act_as_vcard добавлял к моему объекту модели, который обрабатывал бы редактирование vcard для меня и сохранял его обратно в базу данных.

ответ

1

vCard подходит для API, но для реальной базы данных я бы использовал дизайн из 1-го. Каждый человек может иметь много телефонных номеров, адресов, адресов электронной почты, прошлых работодателей. Для нынешнего работодателя вы можете сделать соотношение 1-1. Я думаю, что ваше отвращение к объединениям неуместно. При надлежащих показателях производительность должна быть хорошей. Реализация будет намного проще, чем если бы вы постоянно сериализуете и десериализуете денормализованное строковое представление. Вам не придется изобретать велосипед, как вы созерцаете.

+0

Мое отвращение не к объединению. Мое нежелание иметь таблицу для телефонных номеров, таблицу для адресов, таблицу для адресов электронной почты и т. Д. Использование vCard означает, что добавление возможности хранения нового типа информации - это просто изменение вида и не требует создание новой таблицы базы данных. Контактная информация сложная. Я считаю, что сложность заслуживает внимания на уровне приложений, а не на уровне базы данных. Изменения БД всегда более опасны и сложны, чем изменения в приложении, и я не знаю, что мои конкретные требования являются статическими. –

0

1), если вы хотите идти в сериализации маршрут рельсах имеют встроенную поддержку для хранения хэша

из http://api.rubyonrails.org/classes/ActiveRecord/Base.html

class User < ActiveRecord::Base 
    serialize :preferences 
end 

user = User.create(:preferences => { "background" => "black", "display" => large }) 
User.find(user.id).preferences # => { "background" => "black", "display" => large } 

, если вы используете эту технику, я бы поставил сериализированное поле на его собственная модель/объект таблицы, в противном случае он будет включен в каждом находит вызов пользователя, который не является идеальным, может быть,

class User < ActiveRecord::Base 
    has_one :contact_info 
end 

class ContactInfo < ActiveRecord::Base 
    has_many :users 
    serialize :data 
end 

# ... 
user.contact_info.data[:phone_numbers] # => ['999 999-9999', '000 000-0000'] 

2) или если вы хотите идти по маршруту г NoSQL болеет поддерживает MongoDB, вы в основном вставлять контактную информацию в модели пользователя/документ

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

+0

Сериализация маршрута на самом деле довольно близка к тому, что я ищу. (Я не могу поверить, что не знал, что у рельсов была эта опция.) Однако моя надежда была действительно для чего-то, что замаскировалось за типичными активными установщиками записи/геттерами. –

+0

Магазин ActiveRecord от Rails 3.2 сделает это проще. –

Смежные вопросы