Mongoid,如何通过references_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 ]])
任何想法,我如何能做到这一点而无需重写所有可能的方法:) 谢谢 艾力克斯     

解决方法

        点标记法仅适用于嵌入式文档,但是您有2个馆藏-房屋和所有者。 在MongoDB中的所有者记录之一中,您只有field_id字段,在众议院记录之一中,您与所有者模型没有任何关系。 因此,唯一的方法是获取所有House,然后使用Enumerable#sort对已实现的收藏进行排序。     ,        方法是: -将所有者名称作为字符串嵌入房屋文档中。 房屋对象将具有owner_id(以便您可以获取完整的所有者文档)和仅所有者名称为字符串的额外字段。 您只需要在更改owner_id时更改名称即可,并且可以在1次更新中完成,因此它是一致的。 使用此方法将是非常有效的查询,因为它无需查看集合和文档以进行读取。 缺点是使用了更多的内存。 让所有者对象引用房子,因为所有者“所有者”。 然后,您可以查询按名称排序的所有者,然后获取将以正确顺序获取的参考房屋文件。 这不利于进行许多单独的查询。 一种极端的解决方案是将所有这些文档嵌入:所有者内部的帽子,所有者内部的房子。 最好, 股份公司