跨嵌入式文档的 Mongoid HABTM 关系
Mongoid HABTM relationships across embedded documents
我正在尝试在 Rails 4 中的两个嵌入文档之间创建一个 Mongoid N-N 引用关联,但是我发现很难理解这是如何完成的。
我首先将 HABTM 关联添加到下面的相关模型(Track
和 Option
),但当然我收到错误消息说这是不允许的,因为它们都是嵌入式。
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) 等...
我正在尝试在 Rails 4 中的两个嵌入文档之间创建一个 Mongoid N-N 引用关联,但是我发现很难理解这是如何完成的。
我首先将 HABTM 关联添加到下面的相关模型(Track
和 Option
),但当然我收到错误消息说这是不允许的,因为它们都是嵌入式。
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) 等...