0

ポンプとパーツの間には多対多の関係があります。パーツ ID をポンプ ドキュメントに保存しています。また、特定のポンプで使用されているパーツの数も保存したいと思います。

要するに、これが私が持っているものです

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

ポンプごとに使用されるパーツの数が異なることに気付くまで、これはうまく機能しました。したがって、関係ごとに数量を保存する必要があり、メモなどの他のリレーショナル固有の情報を保存する必要があります。

IDの配列を保存するだけでなく、代わりにこのようなものが欲しいです。

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

これを機能させる方法がわかりません。

4

1 に答える 1

0

PartUsage など、関係をカプセル化するための 3 番目のモデルが本当に必要なようです。重要なのは、リレーションシップ自体に関するいくつかのデータを保存して操作しようとしており、それには別のモデルが必要であるということです (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
于 2010-02-15T19:04:25.347 に答える