我试图在Rails 4中的两个嵌入文档之间创建一个Mongoid N-N引用关联,但是我发现很难理解这是如何完成的。
我首先将HABTM关联添加到下面的相关模型(Track
和Option
),但我当然得到错误,说明这是不允许的,因为他们&# 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是多级深度,需要为层次结构中的每个父级存储一个密钥。"
我很乐意存储额外的外键,但我不知道如何以及采用何种格式。如果有人能指出我正确的方向,我将不胜感激。
答案 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)等......