0

我正在尝试在 Rails 4 中的两个嵌入式文档之间创建 Mongoid NN 引用关联,但是我发现很难弄清楚这是如何完成的。

我首先将 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

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

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

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

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

4

1 回答 1

0

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

===

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

例如,

轨道 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 导致 Tracks 1、2 的更新(再次无限重复)

5) 等等...

于 2015-06-22T14:56:14.537 回答