Динамические поля в Ruby On Rails Web App - PullRequest
0 голосов
/ 23 июля 2011

Я разрабатываю приложение Ruby On Rails для сбора данных от пользователей о продуктах через веб-формы.Таблица базы данных содержит все ProductTypes, другая таблица содержит ProductAttributes, а ProductTypes_ProductAttributes - это таблица отношений, отображающая атрибуты, которые назначены определенным типам продуктов.Данные, собранные для каждого конкретного продукта, затем сохраняются в таблице «Продукты» (со столбцом / полем для каждого атрибута - который может быть пустым, если этот атрибут не имеет отношения к товару).

Я хочу добавитьфункция, позволяющая пользователям-администраторам добавлять новые атрибуты ProductAttributes в систему, а затем назначать их определенным типам ProductTypes.Нет проблем, кроме случаев, когда речь идет о сохранении определенных собранных продуктов.Это потребует динамического добавления нового поля атрибута в таблицу Products во время выполнения.Вот где я немного озадачен, как лучший способ сделать это ...

1) Хранить продукты в XML-документе ... Это сэкономит, имея кучу пустых полей в БД дляатрибуты, которые не принадлежат ProductType для этого продукта, и означает, что новые типы атрибутов могут быть сохранены без проблем.Я немного устал от хранения данных в файлах XML, хотя я всегда рассматривал их как средство передачи и перемещения данных, а не их хранения.

2) Продолжать использовать СУБД, но включаюПоле BLOB для хранения атрибутов, которые могут быть динамическими для продукта в XML, в то время как традиционные поля остаются для кода продукта, описания и т. Д. И т. Д.

3) Наконец, существует ли решение СУБД для вышеупомянутого?Я видел некоторые дискуссии о MongoDB, но, признаюсь, я действительно не знаком с тем, что он имеет опыт работы с более традиционными базами данных.

Интересно, есть ли у кого-нибудь опыт и советы по этому поводу, которые он хотел быпередай?Мне бы хотелось что-то, что интегрируется с Ruby on Rails и позволяет динамически добавлять поля постоянства, не требуя каких-либо изменений кода при добавлении поля в таблицу БД?

Cheers,

Steve

1 Ответ

2 голосов
/ 23 июля 2011

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

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

Что касается вашего вопроса, вы, похоже, уже на правильном пути, создав отдельные таблицы для product_types и product_attributes, а затем таблицу, которая их объединяет.

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

Мне кажется, что то, что вы хотите сделать, может быть достигнуто с немного другим дизайном базы данных.Вот как могла бы выглядеть ваша схема:

create_table "products" do |t|
  t.string "name"
  t.integer "product_type_id"
  # ... other fields
end

create_table "product_types" do |t|
  t.string "name"
  # ... other fields
end

create_table "product_attributes" do |t|
  t.string "name"
  # ... other fields
end

create_table "product_attributes_product_types" do |t|
  t.integer "product_attribute_id"
  t.integer "product_type_id"
end

create_table "product_product_attributes" do |t|
  t.integer "product_id"
  t.integer "product_attribute_id"
  t.string "value"
end

Таким образом, вместо таблицы products, содержащей данные о фактических продуктах, вы можете хранить данные в отдельной таблице product_product_attributes.

Когда пользователь-администратор заполняет форму для каждого продукта, он / она сначала выбирает нужные типы продуктов, к которым относится продукт.Как только тип продукта установлен, в форме администратора будут отображаться только атрибуты, связанные с этим типом продукта.Присвоение атрибутов товара различным типам товаров - это отдельная задача администратора.

Надеюсь, это поможет.

~ Andrea

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