Полиморфная модель Ruby on rails: динамические поля - PullRequest
1 голос
/ 23 марта 2011

Предположим, у меня есть базовый класс модели Item

class Item
  include Mongoid::Document
  field :category
end

Каждая категория определяет, какие поля должен содержать элемент.Например, элементы в «category1» должны содержать дополнительное строковое поле с именем text, элементы в «category2» должны содержать поля weight и color.Все поля имеют базовые типы: строки, целые числа и т. Д.

Эти дополнительные значения должны храниться в mongodb как поля документа:

> db.items.find()                                                   
{ "_id" : ObjectId("4d891f5178146536877e1e99"), "category" : "category1", "text" : "blah-blah" }
{ "_id" : ObjectId("4d891f7878146536877e1e9a"), "category" : "category2", "weight" : 20, "color" : "red" }

Категории хранятся в mongodb,тоже.Конфигурация полей определяется во время выполнения администратором.

> db.categories.find()                                                                 
{ "_id" : "category1", "fields" : [ { "name" : "text", "type" : "String" } ] }
{ "_id" : "category2", "fields" : [
    {
        "name" : "weight",
        "type" : "Integer"
    },
    {
        "name" : "color",
        "type" : "String"
    }
] }

Пользователи должны редактировать элементы с помощью HTML-форм, вводя значения для всех дополнительных полей, определенных для категории конкретного элемента.

Вопросis

Какие подходы я могу использовать для реализации этого полиморфизма на рельсах?

Пожалуйста, запросите необходимые подробности с комментариями.

1 Ответ

0 голосов
/ 04 апреля 2011

Просто создайте подкласс Item, и Mongoid позаботится об отдыхе, например, о типе хранения.

class TextItem < Item; end

Rails понравится, но вы, вероятно, захотите использовать метод #becomes, так как он сделаетСоздатель форм доволен и путь создания проще:

https://github.com/romanbsd/mongoid/commit/9c2fbf4b7b1bc0f602da4b059323565ab1df3cd6

...