【问题标题】:Mongoid::Errors::MixedRelationsMongoid::Errors::MixedRelations
【发布时间】:2011-12-08 20:22:23
【问题描述】:

我有一个嵌入“one to many”的用户模型,如下所示:

class User 
  include Mongoid::Document

  field :uid
  field :name     
  field :user_hash

  embeds_many :watchlists
end


class Watchlist
  include Mongoid::Document

  field :html_url
  field :description

  #field :name
  field :fork_, :type => Boolean

  field :forks, :type => Integer
  field :watchers, :type => Integer

  field :created_at, :type => DateTime
  field :pushed_at, :type => DateTime

  field :avatar_url

  embedded_in :user
  has_and_belongs_to_many :tags
end

监视列表还应引用many to many 标签模型,反之亦然:

class Tag
  include Mongoid::Document
  field :name, type: String

  has_and_belongs_to_many :watchlists
end

无论如何,这会导致错误,并且似乎这种“混合”关系是不可能的:

Mongoid::Errors::MixedRelations (Referencing a(n) Watchlist document from the Tag document via a relational association is not allowed since the Watchlist is embedded.):
 app/controllers/home_controller.rb:53:in `tagging'

更新 请注意,监视列表必须被删除 (user.watchlists.clear) 而不是重新创建 (user.watchlists.find_or_create_by) 一天四次,而标签/s 必须是持久的,与以前相同的嵌入式监视列表相关联 (. ..我不确定这是否可能,因为之前的 drop/creation )。

UPDATE 的更新(坦克到durran 支持) 不,这是不可能的:如果您清除嵌入的文档,ID 也会消失,并且每次创建新文档时都会生成新的文档。

您对如何克服这一点有任何想法吗? 在referenced relations(三个不同的集合)中拆分所有三个模型会更好吗?

【问题讨论】:

  • [RE: UPDATE of UPDATE] 但是您可以通过在创建文档时专门分配一些 id 来使 id 与以前的相同。 ids = model.embedded_docs.map(&:_id); model.embedded_docs.clear;ids.each{ |id| model.embedded_docs.create(:id => id) }。运行此代码嵌入文档将在清除前后具有相同的 id。
  • 是的,非常有趣的把戏。谢谢。

标签: ruby-on-rails mongodb mongoid


【解决方案1】:

在 mongoid 中,您不能引用嵌入的文档。所以问题出在你的标签模型中,在那里定义了 habtm。您可以在嵌入式监视列表中使用 HABTM,而无需任何反比关系。

class User 
  include Mongoid::Document
  embeds_many :watchlists
end

class Watchlist
  include Mongoid::Document
  embedded_in :user
  has_and_belongs_to_many :tags, inverse_of: nil
end

class Tag
  include Mongoid::Document
end

但如果您必须在标签中引用监视列表,您可以手动维护两侧的 id 数组,正如 Tyler 已经指出的那样。

【讨论】:

    【解决方案2】:

    不是您正在寻找的答案,但是...对于它的价值,每当我在 mongoid 中使用 HABTM 关系时,它要么有问题,要么不起作用。我不知道这是否已经解决,但如果你坚持只在模型中使用数组,而且在关系的反面,你应该是金色的。无论如何,这几乎就是代码将为您做的事情。

    是的,你必须做更多的工作来维持这种关系,但它实际上就像它应该做的那样工作。

    祝你好运。

    【讨论】:

    • 您认为这是 MongoId 问题还是更普遍的 MongoDb/No-SQL 限制?
    • 最有可能是Mongoid问题,但是在您描述了随着事物更新的模型和频率之后,您正在做什么非常不清楚。
    • ...试图更好地解释(但我不知道),请参阅更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多