2011-06-23 114 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