ruby-on-rails - Mongoid embeds_many 和 has_many 到同一个模型

标签 ruby-on-rails mongodb mongoid

我有一个嵌入了许多“SuggestedPerson”的模型“Person”。 SuggestedPerson 还引用另一个人(被建议的人)。所以 Person 需要 embed_many 和 has_many SuggestedPerson。问题是 Mongo 返回错误:

Failure/Error: Mongoid::Errors::MixedRelations:

   Problem:
     Referencing a(n) SuggestedPerson document from the Person document via a relational association is not allowed since the

SuggestedPerson is embedded.

代码:

class Person
  embeds_many :suggested_persons, :class_name => "SuggestedPerson", :inverse_of => :person
  has_many :suggested_to_persons, :class_name => "SuggestedPerson", :inverse_of => :to_person
end

class SuggestedPerson
  embedded_in :person, :class_name => "Person", :inverse_of => :suggested_persons 
  belongs_to :to_person, :class_name => "Person", :inverse_of => :suggested_to_persons
end

有解决办法吗?

最佳答案

由于 Mongoid 只能做其中之一,因此需要一种解决方法。这是一个(未经测试的)示例,希望能让您朝着正确的方向前进。

如果您需要嵌入的 SuggestedPerson 对象引用另一个 Person 对象(除了父对象),您可能需要在 SuggestedPerson 嵌入对象上创建一个字段,例如:

field :person_being_suggested_id, type: String

此属性可以存储其他 Person 对象的 ID。在您的 SuggestedPerson 表单上,假设我们在 SuggestedPerson Controller (@persons = Person.all) 中有包含您所有人员的实例变量,并且该人员具有 name 属性,这样我们就可以使用这个 nice 从下拉列表中进行选择助手:

<%= f.collection_select(:person_being_suggested_id, @persons, :id, :name, {prompt: ""}) %>

在您的 SuggestedPerson 模型中,您可以使用以下方法:

def suggested_persons_name
  Person.find_by(id: self.person_being_suggested_id).name
end

这样,当您使用 Person 类的实例时,您可以调用如下内容:

@person.suggested_persons.each do |person|
  p person.suggested_persons_name
end

或者假设您正在使用 SuggestedPerson 类的实例:

@suggested_person.suggested_persons_name

第一个示例将遍历 Person 对象中所有嵌入的 SuggestedPersons,对每个对象调用方法 suggested_persons_name 并返回所有姓名的列表。第二个示例将只返回为该特定嵌入文档推荐的人员姓名。

关于ruby-on-rails - Mongoid embeds_many 和 has_many 到同一个模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15054009/

相关文章:

javascript - 如何更新数组、对象内、数组内的数组?

json - 带有空 objectid 引用的 Mongo 保存文档 - 错误 : Invalid ObjectId in JSON

ruby-on-rails - Mongoid:从 Moped::Errors 获取 mongo 错误代码

ruby-on-rails - ruby + Mongoid : how to make a required field?

mongodb - 如何使用 Mongoid 执行 $geoIntersects 查询?

ruby-on-rails - 从 Rails 应用程序中的 gem 重载 CSS 文件

ruby-on-rails - Rails5/强参数/带有 'dynamic' 键的 json 列

ruby-on-rails - 你如何让这个 div 环绕图像链接?

parsing - Node CSV 解析器输出问题

ruby-on-rails - 无法加载 EventMachine C 扩展;使用纯 ruby react 器