0

次のモデル構造があります。多くの旅程ノードを持つ旅程があります。各旅程ノードは、場所、ホテル、アクティビティなどのラッパーです。たとえば、

Itinerary = "パリ​​への旅" Itinerary.itinerary_nodes = [Node1, Node2, Node3] ここで、Node1 = "JFK 空港" Node2 = "CDG 空港" Node3 = "エッフェル塔"

基本的に、ノードは旅程で訪れる場所を表します。私のモデル構造では; 私の空港はモニュメントやホテルとは異なるモデルであると仮定しましょう。今、私はそのような関連付けを作成したいと思います;

class ItineraryNode
  include Mongoid::Document
  has_one :stopover
end

各途中降機が異なるオブジェクトになる場合があります。タイプとIDはデフォルトで保存され、後でそれを使用して膨らませます。

では、複数のモデルが ItineraryMode に関連付けられるように宣言するにはどうすればよいでしょうか? これらの属性を初期化子で手動で設定することで、これを具体的に実装できます。しかし、このようなものがデフォルトでサポートされているかどうかは興味深い.

乾杯

4

1 に答える 1

4

これは「has_one」ではなく、「belongs_to」(ポリモーフィック) です。

class ItineraryNode
  include Mongoid::Document
  belongs_to :stopover, :polymorphic => true
  belongs_to :itinerary
end

class Airport
  include Mongoid::Document
  has_many :itinerary_nodes, :as => :stopover
end

class Place
  include Mongoid::Document
  has_many :itinerary_nodes, :as => :stopover
end

だから今、あなたは得ることができます:

@itinerary.itinerary_nodes.each do |node|
  if node.stopover.is_a? Airport
    puts "Welcome to #{note.stopover.name}"
  elsif node.stopover.is_a? Event
    puts "Bienvenue, would you like a drink?"
  elsif node.stepover.is_a? Place
    puts "The ticket line is over there"
  end
end

(ifポリモーフィズムをよりよく示すためだけに構成を使用しcaseました。ここでは構成を使用します...)

node.stepoverこれは多くのクラスであることがわかります。

編集(コメントの後、ItineraryNodeモデルは多対多の関連付けのための手作りのポリモーフィズムへの試みであることを理解しています。

Mongoid のドキュメントから:

has_and_belongs_to_many を除くすべてのリレーションでポリモーリックな動作が許可されます。

したがって、中間モデル ( ) を使用する必要がありますItineraryNode。提供されたソリューションは、私が考えることができる最も単純なものです。

于 2012-10-06T05:46:12.033 に答える