2013-02-24 86 views
3

我有一個模型「人」embeds_many「SuggestedPerson」s。 SuggestedPerson還引用了另一個人(被推薦的人)。所以Person需要embed_many和has_many SuggestedPerson。問題是蒙戈返回錯誤:Mongoid embeds_many和has_many到相同的模型

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 

有沒有辦法解決?

+0

最快的方法是將關聯更改爲has_many,但這很不方便。 – freemanoid 2013-03-05 09:05:55

+0

是的,謝謝,那差不多是我所做的:/ – LMH 2013-03-05 14:57:41

+0

但我也想知道另一個解決方案沒有破解... – freemanoid 2013-03-06 07:27:20

回答

0

由於Mongoid只能做一個或另一個,所以需要一個解決方法。這是一個(未經測試的)例子,希望能讓你朝着正確的方向前進。

如果您需要嵌入SuggestedPerson對象引用另一個Person對象(除了父母)你可能需要到SuggestedPerson嵌入對象上創建一個領域,像這樣:

field :person_being_suggested_id, type: String 

該屬性可以存儲其他Person對象的ID。在您的SuggestedPerson表單上,我們假設我們已經在SuggestedPerson控制器中包含所有人員的實例變量(@persons = Person.all),並且人員擁有一個名稱屬性,這樣我們就可以使用這個不錯的下拉選擇助手:

<%= 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,並返回一個列表所有名字。第二個示例將僅返回爲特定嵌入文檔建議的人員的姓名。