Ruby on rails 3 Mongoid,如何通过引用对一个关联(以及后续关联)进行排序?

Ruby on rails 3 Mongoid,如何通过引用对一个关联(以及后续关联)进行排序?,ruby-on-rails-3,mongodb,associations,sql-order-by,mongoid,Ruby On Rails 3,Mongodb,Associations,Sql Order By,Mongoid,简单模型: 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.a

简单模型:

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 ]])
如果可能的话,我能在不重写所有内容的情况下实现这一点吗:)

谢谢


ALex

点表示法仅适用于嵌入文档,但您有两个集合-房屋和所有者。 在MongoDB中的一个所有者记录中,您只有字段house_id,而在一个house记录中,您与所有者模型没有任何关联。 因此,唯一的方法是获取所有房屋,然后使用可枚举的#排序对收集的房屋进行排序。

实现这一点的方法是: -将所有者名称作为字符串嵌入房屋文档中。 house对象既有一个owner_id(以便您可以获取完整的owner doc),又有一个仅将owner name作为字符串的额外字段。 您只需要在更改所有者id时更改名称,这可以在1次更新中完成,以便保持一致。 使用它将是一个非常有效的查询,因为它不需要查看集合和文档以进行读取。 缺点是使用了更多的内存

  • 让所有者对象引用房子,因为所有者“拥有”。 然后,您可以查询按名称排序的所有者,然后按正确的顺序获取参考房屋文档。 这有很多单独查询的缺点

  • 一个极端的解决方案是嵌入所有这些文档:帽子放在所有者里面,所有者放在房子里面

最好的,
AG

我明白了,这对我来说是不可能的,我的系统中有太多的房子:)我将不得不去规范化数据并复制房子中的帽子颜色。。。我将不得不离开,结果是我的帽子颜色可能不是最新的…你需要在另一个系列中存储房屋所有者吗?你可以在房子里存储主人,在主人身上存储帽子。我几乎选择了解决方案一