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 回答