Ruby on Rails与Mongoid结合时,如何解决MixedRelations错误问题?

2026-04-11 17:453阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计501个文字,预计阅读时间需要3分钟。

Ruby on Rails与Mongoid结合时,如何解决MixedRelations错误问题?

我有一种用户模型嵌入one to many关系,注意列表示例:rubyclass User include Mongoid::Document field :uid field :name field :user_hash embeds_many :watchlistend

class Watchlist include Mongoid::Document field :_urlend

我有一个用户模型嵌入“ 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'

UPDATE
请注意,必须删除监视列表(user.watchlists.clear),而不是每天重新创建(user.watchlists.find_or_create_by)四次,而Tag / s必须是持久的,与之前相关的嵌入式监视列表(. ..无论如何,我不确定是否可能,因为先前的下降/创建).

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

你对如何克服这个问题有任何想法吗?
在referenced relations(三个不同的系列)中拆分所有三个模型是否更好?

在mongoid中,您不能引用嵌入式文档.所以问题在于你的标签模型中定义了habtm.您可以在嵌入式监视列表中使用HABTM,而没有任何反向关系.

Ruby on Rails与Mongoid结合时,如何解决MixedRelations错误问题?

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

本文共计501个文字,预计阅读时间需要3分钟。

Ruby on Rails与Mongoid结合时,如何解决MixedRelations错误问题?

我有一种用户模型嵌入one to many关系,注意列表示例:rubyclass User include Mongoid::Document field :uid field :name field :user_hash embeds_many :watchlistend

class Watchlist include Mongoid::Document field :_urlend

我有一个用户模型嵌入“ 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'

UPDATE
请注意,必须删除监视列表(user.watchlists.clear),而不是每天重新创建(user.watchlists.find_or_create_by)四次,而Tag / s必须是持久的,与之前相关的嵌入式监视列表(. ..无论如何,我不确定是否可能,因为先前的下降/创建).

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

你对如何克服这个问题有任何想法吗?
在referenced relations(三个不同的系列)中拆分所有三个模型是否更好?

在mongoid中,您不能引用嵌入式文档.所以问题在于你的标签模型中定义了habtm.您可以在嵌入式监视列表中使用HABTM,而没有任何反向关系.

Ruby on Rails与Mongoid结合时,如何解决MixedRelations错误问题?

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