Mongoid ::错误:: MixedRelations

我有一个用户模型嵌入“ 一对多 ”的关注列表,如下所示:

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 

监视列表还应引用多对多 Tag模型,反之亦然:

 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)四次,而Tag / s必须是持久的,与之前的嵌入式监视列表相关联( ……无论如何,我不确定这是否可能,因为先前的下降/创造。

UPDATE更新 (坦克到durran支持)不,这是不可能的:如果你清除嵌入式文档,那么id也会消失,每次创建一个新的时候都会生成新的。

你对如何克服这个问题有任何想法吗? 将所有三个模型拆分为引用关系 (三个不同的集合)是否更好?

在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已经指出的那样。

不是你正在寻找的答案,而是…为了它的价值,每当我在mongoid中使用HABTM关系时它要么是错误的,要么是不起作用的。 我不知道这是否已经修复,但如果你坚持只使用模型中的数组,并且在关系的反面,你应该是金色的。 无论如何,这几乎就是代码会为你做的事情。

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

祝好运。