首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mongoid has_one多态性关联的逆反

Mongoid has_one多态性关联的逆反
EN

Stack Overflow用户
提问于 2012-10-06 11:54:10
回答 1查看 1.4K关注 0票数 0

我有一个如下的模型结构。我有一个包含多个行程节点的行程。例如,每个行程节点都是一个围绕地点、酒店、活动等的包装器。

Itinerary =“巴黎之旅”Itinerary.itinerary_nodes = Node1,Node2,Node3,其中Node1 =“肯尼迪机场”Node2 = "CDG机场“Node3 =”埃菲尔铁塔“

因此,从本质上讲,nodes代表了您在行程中要访问的地方。在我的模型结构中;让我们假设我的机场的建模与纪念碑或酒店不同。现在我想创建一个关联,这样;

代码语言:javascript
复制
class ItineraryNode
  include Mongoid::Document
  has_one :stopover
end

其中每个中途停留可以是不同的对象。默认情况下,它的type和id被存储起来,以后会用它来膨胀。

那么,如何声明与ItineraryMode关联的多个模型呢?我可以通过确保在initializer中手动设置这些属性来实现这一点;但是我很好奇默认情况下是否支持这样的属性。

干杯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-06 13:46:12

这不是"has_one",而是"belongs_to“(多态)

代码语言:javascript
复制
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

所以现在你可以得到:

代码语言:javascript
复制
@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)。提供的解决方案是我能想到的最简单的解决方案。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12756580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档