Хранение дополнительной информации о документе в Mongo Mapper через массив: - PullRequest
0 голосов
/ 12 февраля 2010

У меня есть много-много отношений между насосами и запчастями. Я храню идентификаторы деталей в документе Pump. Я также хотел бы сохранить количество деталей, используемых в конкретном насосе.

Вот что у меня есть, короче

class Pump
  include MongoMapper::Document

  key :number, String
  key :desc, String
  key :part_ids, Array

  many :parts, :in => :part_ids 
end

class Part
  include MongoMapper::Document

  attr_accessor :pump_ids

  key :qty, Integer
  key :number, String
  key :desc, String

  def pumps
    Pump.all(:part_ids => self.id)
  end
end

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

Вместо того, чтобы просто хранить и хранить массив идентификаторов, я бы хотел что-то вроде этого.

[{:pump_id => "12hj3hjkbrw", :qty = 4},
 {:pump_id => "ggtyh5ehjrw", :qty = 10, :notes => "when using this part with this Pump please note this"}]

Я не уверен, как заставить это работать.

1 Ответ

0 голосов
/ 15 февраля 2010

Похоже, вам действительно нужна третья модель, например, PartUsage или что-то другое, чтобы инкапсулировать отношения. Ключевым моментом является то, что вы пытаетесь хранить и работать с некоторыми данными о самой взаимосвязи, для чего требуется другая модель (идеальным является EmbeddedDocument).

Вы можете сделать что-то вроде этого (остерегайтесь: не проверено!):

class Pump
  include MongoMapper::Document

  key :number, String
  key :desc, String
  key :part_usage_ids, Array

  many :part_usages
end

class Part
  include MongoMapper::Document

  key :qty, Integer
  key :number, String
  key :desc, String

  def pumps
    # not 100% sure of this query actually
    PartUsage.all(:part_id => self.id).collect { |pu| pu.pump }
  end
end

class PartUsage
  include MongoMapper::EmbeddedDocument

  belongs_to :pump
  belongs_to :part
  key :pump_id, ObjectId
  key :part_id, ObjectId
  key :qty, Integer
  key :notes, String
end
...