跨嵌入式文档的 Mongoid HABTM 关系

Mongoid HABTM relationships across embedded documents

我正在尝试在 Rails 4 中的两个嵌入文档之间创建一个 Mongoid N-N 引用关联,但是我发现很难理解这是如何完成的。

我首先将 HABTM 关联添加到下面的相关模型(TrackOption),但当然我收到错误消息说这是不允许的,因为它们都是嵌入式。

class Brief
  embeds_many :tracks
end

class Track
  embedded_in :brief
  has_and_belongs_to_many :options
end

class Category
  embeds_many :options
end

class Option
  field :name, type: String
  field :track_ids, type: Array
  embedded_in :category
  has_and_belongs_to_many :tracks

  def parent
    self.category
  end

  def tracks
    self.parent.tracks.where(:option_id => self.id)
  end
end

我完全理解为什么会这样,并且知道我需要参考父文档,但这是我 运行 遇到麻烦的地方。

我一直在尝试通过控制台数组将曲目 ID 添加到 track_ids,但我最终得到了与以前相同的错误:

”问题: 由于 Track 是嵌入的,因此不允许通过关系关联从 Option 文档引用 (n) Track 文档。 概括: 为了从 Option 正确访问 a(n) Track,引用需要通过 Track 的根文档。在一个简单的情况下,这将需要 Mongoid 为根存储一个额外的外键,在更复杂的情况下,Track 有多级深度,需要为层次结构中的每个父级存储一个键。"

我很乐意存储额外的外键,但我不知道如何以及以什么格式存储。如果有人能指出我正确的方向,我将不胜感激。

您收到错误的原因是由于以下逻辑。如果您需要表示多对多关系,请不要使用文档模型来存储您的状态。使用关系型

===

没有 association/reference table/object 就无法表示多对多关系。如果您没有参考 table,那么您对任何一端的更新都可能导致无限更新,因为您的所有关系(以及它们的关系)都将被触及(并可能重新保存)

例如,

曲目 1,=> 选项 1、2、3

选项 1,=> 曲目 1、2、3

轨道 2,=> 选项 1、2

选项 2,=> 曲目 1、2

轨道 3,=> 选项 1、3、4

选项 3,=> 曲目 1、3、4

现在让我们继续编辑音轨 1,

1) 更新轨道 1

2) 导致更新选项 1、2、3

3) 选项 1 导致轨道 1 的重新=更新,(无限重复 1,2,3)

4) 选项 2 导致轨道 1、2 的更新(再次无限重复)

5) 等...