Как реализовать пользовательский тип в mongomapper - PullRequest
1 голос
/ 24 декабря 2010

Я хочу следующую структуру модели:

Item
  name
  options
    price
      value
      currency
    weight

для совершения звонков:

item.name #name of the item
item.options #options hash
item.options.price.value #item's price
item.options.price.currency #item price's currency
item.options.weight #item's weight

Не спрашивайте меня, почему я хочу такую ​​структуру. Объясните мне пожалуйста как пользовательские типы работают в мире mongomapper ...

1 Ответ

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

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

class Item
  include MongoMapper::Document

  key :name, String
  one :options, :class_name => "Option"
end

class Price
  include MongoMapper::EmbeddedDocument

  key :value, Float
  key :currency, String
  belongs_to :option
end

class Option
  include MongoMapper::EmbeddedDocument

  key :weight, Float
  one :price
  belongs_to :item
end

В монго это будет храниться как:

{
  "_id" => BSON::ObjectId('4d9bf8e8516bcb45ec000001'),
  "name" => "name",
  "options" => {
    "_id" => BSON::ObjectId('4d9bf92a516bcb45ec000002'),
    "weight" => 1.0,
    "price" => {
      "_id" => BSON::ObjectId('4d9bfa04516bcb45ec000003'),
      "value" => 1.0,
      "currency" => "rubies"
    }
  }
}

Или, если вы на самом деле запрашиваете надуманный пример для пользовательского типа (взгляните на пример) , вы можете просто сохранить эту структуру как Hash и просто загрузить все это в Составьте , OpenStruct или просто бросьте свой собственный класс.

...