2011-06-23 93 views
4

簡單的模型:Mongoid,如何通過reference_one關聯(以及後續的關聯)order_by?

class hat 
    embedded_in :owner 
    field :color 
end 

class owner 
    embedds_one :hat 
    referenced_in :house 
    field :name 
end 

class house 
    references_one :owner 
    field :number 
end 

所以,簡單地提出,我們有關聯到業主房屋的集合,車主可以有顏色的帽子。

我可以簡單地通過它們的數量排序的房子:

House.all.order_by([[ :number, :asc ]]) 

但我要的是訂購房子,他們的主人的名字是什麼,我非常希望這樣寫:

House.all.order_by([[ :'owner.name', :asc ]]) 

但它不起作用...

甚至進一步我想能夠按主人的帽子的顏色排序房屋

House.all.order_by([[ :'owner.hat.color', :asc ]]) 

任何想法,我怎麼能做到這一點無需重寫一切可能的話:)

感謝

亞歷

回答

3

點符號只爲嵌入文檔是可能的,但你有2個集 - 房屋和擁有者。 在MongoDB中的一個Owner記錄中,只有字段house_id,在其中一個House記錄中,您沒有與Owner模型的任何連接。 所以唯一的方法是獲取所有房屋,然後使用Enumerable#sort對已實現的集合進行排序。

+0

我明白了,那麼這不會對我來說是不可能的,太多的房子在我的系統:)我將不得不去標準化數據和複製的帽子顏色我的房子......我將不得不離開,結果是我的帽子顏色可能不是最新的...... – Alex

+0

您是否需要將房屋所有者存儲在另一個集合中?您可以將店主嵌入店內,並將帽子嵌入店主。 – Hck

2

這樣做的方法是: - 在房屋文檔中將所有者姓名作爲字符串嵌入。 房屋對象將擁有一個owner_id(以便您可以獲取完整的擁有者文檔)和一個只有所有者名稱爲字符串的額外字段。 您只需在更改owner_id時更改名稱,並且可以在1次更新中完成,以保持一致。 使用它將是一個非常有效的查詢,因爲它不需要查看集合和文檔以進行讀取。 缺點是使用更多的mem。

  • 有房主對象引用房子,因爲房主「擁有」。 然後,您可以按名稱查詢所有者,然後獲取您將按正確順序獲取的參考房屋文檔。 這有很多個人查詢的缺點。

  • 一個極端的解決方案是嵌入所有這些文檔:帽子內的所有者,屋內的所有者。

最好, AG

+0

我非常喜歡解決方案 – Alex