嵌入式文档中的Mongoid HABTM关系

时间:2015-06-22 14:25:08

标签: ruby-on-rails ruby-on-rails-4 mongoid embedded-documents

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

我首先将HABTM关联添加到下面的相关模型(TrackOption),但我当然得到错误,说明这是不允许的,因为他们&# 39;重新嵌入。

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文档引用(n)Track文档。 摘要:   为了从Option中正确访问(n)Track,引用需要通过Track的根文档。在一个简单的例子中,这将需要Mongoid为根存储额外的外键,在更复杂的情况下,Track是多级深度,需要为层次结构中的每个父级存储一个密钥。"

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

1 个答案:

答案 0 :(得分:0)

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

===

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

例如,

Track 1,=>选项1,2,3

选项1,=>第1,2,3道

Track 2,=>选项1,2

选项2,=>第1,2轨道

Track 3,=>选项1,3,4

选项3,=>第1,3,4号轨道

现在让我们继续编辑Track 1,

1)更新Track 1

2)导致选项1,2,3

中的更新

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

4)选项2导致更新曲目1,2(再次无限重复)

5)等......