问题描述
|
简单模型:
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次更新中完成,因此它是一致的。
使用此方法将是非常有效的查询,因为它无需查看集合和文档以进行读取。
缺点是使用了更多的内存。
让所有者对象引用房子,因为所有者“所有者”。
然后,您可以查询按名称排序的所有者,然后获取将以正确顺序获取的参考房屋文件。
这不利于进行许多单独的查询。
一种极端的解决方案是将所有这些文档嵌入:所有者内部的帽子,所有者内部的房子。
最好,
股份公司