【发布时间】:2014-06-12 07:08:27
【问题描述】:
我有两个班级,分别是Person 和Language。每种 语言 都有一个 creator 和一个 updater 都来自 Person 类。我想通过child查询parent的属性,反之亦然。
人物类
class Person
include Mongoid::Document
field :first_name, type: String
field :last_name, type: String
has_many :created_languages, class_name: 'Language', inverse_of: :created_by, foreign_key: 'created_by_id', autosave: true
accepts_nested_attributes_for :created_languages
has_many :updated_languages, class_name: 'Language', inverse_of: :updated_by, foreign_key: 'updated_by_id', autosave: true
accepts_nested_attributes_for :updated_languages
end
语言类
class Language
include Mongoid::Document
field :content, type: String
belongs_to :created_by, class_name: 'Person', inverse_of: :created_languages, foreign_key: :created_by_id, autosave: true
accepts_nested_attributes_for :created_by
belongs_to :updated_by, class_name: 'Person', inverse_of: :updated_languages, foreign_key: :updated_by_id, autosave: true
accepts_nested_attributes_for :updated_by
end
我想在我的 Rails 应用程序中查询以下内容:即在 Rails 控制台中:
ruby 2.0.0p451 > a = Person.create!(first_name: "Marco", last_name:"Reus")
ruby 2.0.0p451 > b = Language.create!(content: "German", created_by_id: a.id, updated_by_id: a.id)
ruby 2.0.0p451 > a.created_languages (now works)
ruby 2.0.0p451 > a.updated_languages (now works)
ruby 2.0.0p451 > b.created_by (now works)
ruby 2.0.0p451 > b.updated_by (now works)
我曾经收到以下错误。用上面的代码就解决了。
Mongoid::Errors::AmbiguousRelationship:
问题:不明确的关系 :created_languages, :updated_languages 定义在 Person 上。
总结: 当 Mongoid 试图在内存中设置一个关系的逆向文档时,它需要知道它属于哪个关系。设置 :updated_by 时,Mongoid 在类 Language 中查找匹配关系,但发现多个可能匹配的关系::created_languages、:updated_languages。
解决方案:在 Language 的 :updated_by 关系中,您必须添加一个 :inverse_of 选项来指定 Person 与 :updated_by 相反的确切关系。
【问题讨论】:
标签: ruby-on-rails mongoid