【问题标题】:Accessing parent-child attributes in Mongoid在 Mongoid 中访问父子属性
【发布时间】:2014-06-12 07:08:27
【问题描述】:

我有两个班级,分别是PersonLanguage。每种 语言 都有一个 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


    【解决方案1】:

    您还应该为所有这些都包括 inverse_of:

    has_many :created_languages, class_name: 'Language', :inverse_of => :created_by
    
    belongs_to :created_by, class_name: 'Person', :inverse_of => :created_languages
    

    希望对你有帮助。

    【讨论】:

    • 它的部分工作。将inverse_of: :created_by, foreign_key: 'created_by_id', autosave: true 添加到Person 类后,我现在可以调用ruby 2.0.0p451 > a.created_languages。但是将inverse_of: :created_languages, foreign_key: :created_by_id, autosave: true 添加到language 类中我仍然无法调用ruby 2.0.0p451 > b.created_by。你知道第二部分有什么问题吗?谢谢
    • 重新加载编辑后的版本后,它现在可以工作了。 1) 我添加了 :inverse_of 和 2) 我在任何地方添加了 accepts_nested_attributes_for。上面编辑的代码是有效的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    相关资源
    最近更新 更多