2014-06-12 160 views
0

我有兩個類,即PersonLanguage。每個語言具有創建者更新者均來自Person類。我想通過子查詢父代的屬性,反之亦然。訪問Mongoid中的父子屬性

Person類

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 ::錯誤:: AmbiguousRelationship:
問題:曖昧關係:created_languages,:對人定義updated_languages。

摘要:當Mongoid嘗試在內存中設置關係的逆文檔時,它需要知道它屬於哪個關係。當設置:updated_by時,Mongoid查找匹配關係類Language,但找到了可能匹配的倍數::created_languages,:updated_languages。

Resolution:關於語言updated_by關係,您必須添加一個:inverse_of選項來指定與Person相反的:updated_by的確切關係。

回答

0

你還應該包括inverse_of爲所有這些爲這樣:

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

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

希望它能幫助。

+0

部分工作。在將'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'我仍然不能調用ruby 2.0.0p451> b.created_by'。你會知道第二部分有什麼問題嗎? thx – soosap

+0

重新加載編輯後的版本,現在可以運行。 1)我添加了':inverse_of'和2)我在所有地方都添加了'accep_nested_attributes_for'。上面編輯的代碼是可用的。謝謝。 – soosap