我有一个如下的模型结构。我有一个包含多个行程节点的行程。例如,每个行程节点都是一个围绕地点、酒店、活动等的包装器。
Itinerary =“巴黎之旅”Itinerary.itinerary_nodes = Node1,Node2,Node3,其中Node1 =“肯尼迪机场”Node2 = "CDG机场“Node3 =”埃菲尔铁塔“
因此,从本质上讲,nodes代表了您在行程中要访问的地方。在我的模型结构中;让我们假设我的机场的建模与纪念碑或酒店不同。现在我想创建一个关联,这样;
class ItineraryNode
include Mongoid::Document
has_one :stopover
end其中每个中途停留可以是不同的对象。默认情况下,它的type和id被存储起来,以后会用它来膨胀。
那么,如何声明与ItineraryMode关联的多个模型呢?我可以通过确保在initializer中手动设置这些属性来实现这一点;但是我很好奇默认情况下是否支持这样的属性。
干杯
发布于 2012-10-06 13:46:12
这不是"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)。提供的解决方案是我能想到的最简单的解决方案。
https://stackoverflow.com/questions/12756580
复制相似问题