【问题标题】:Inverse of Mongoid has_one polymorphic associationMongoid has_one 多态关联的逆
【发布时间】:2012-10-06 15:20:01
【问题描述】:

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

行程 = “巴黎之旅” Itinerary.itinerary_nodes = [Node1, Node2, Node3] 其中 Node1 =“肯尼迪机场” Node2 = "戴高乐机场" Node3 = "埃菲尔铁塔"

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

class ItineraryNode
  include Mongoid::Document
  has_one :stopover
end

每个中途停留点可以是不同的对象。它的 type 和 id 是默认存储的,以后会使用它来膨胀。

那么如何声明多个模型关联到 ItineraryMode?我可以通过确保在初始化程序中手动设置这些属性来专门实现这一点;但很好奇默认情况下是否支持这样的东西。

干杯

【问题讨论】:

    标签: ruby-on-rails activerecord associations mongoid3


    【解决方案1】:

    这不是“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 可以是许多类。

    编辑(在评论之后,我了解到ItineraryNodemodel 是对多对多关联的手工多态性的尝试。

    来自 Mongoid 文档:

    除了 has_and_belongs_to_many 之外的所有关系都允许多态行为。

    因此您需要使用中间模型 (ItineraryNode)。提供的解决方案是我能想到的最简单的解决方案。

    【讨论】:

    • 我的目的是让行程有很多节点;节点环绕中途停留的地方。我理解您的陈述;但我不想在我的行程中说行程有_许多机场; has_many 地方等。我想说行程 has_many 节点。然后节点可以抽象出底层的地方。所以我希望 Node 能够说 has_one :something 然后某个东西可以是机场或地方或其他任何东西。我认为从您上面显示的内容来看不可能实现这一目标。
    • 重点是“has_one”意味着“belongs_to”在另一边。您不希望 Airport 属于某个节点(它将仅属于该节点)。所以你想要的是节点 belongs_to 东西,并且东西可以是任何需要的东西(即多态性)。我将编辑回复以使其更清晰。
    • 太棒了!现在一切都清楚了。感谢您竭尽全力进行如此详细的解释。我明白你的意思了,现在。干杯。
    • 太棒了,我什至不知道,这是可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    相关资源
    最近更新 更多