Mongoid,如何通过references_one关联(以及后续关联)来订购?

时间:2011-06-23 09:32:22

标签: 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.all.order_by( [[ :number, :asc ]])

但我想要的是按照主人的名义订购房子,理想情况下我想写一下:

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

但它不起作用......

更进一步,我希望能够按照主人帽子的颜色对房屋进行分类

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

如果可能的话,如果不重写所有内容,我知道如何实现这一目标:)

由于

ALEX

2 个答案:

答案 0 :(得分:3)

点符号仅适用于嵌入式文档,但您有2个集合 - 房屋和所有者。 在MongoDB中的一个所有者记录中,您只有字段house_id,在其中一个House记录中,您没有与所有者模型的任何连接。 所以唯一的方法是获取所有的Houses,然后使用Enumerable #sort。对其进行排序。

答案 1 :(得分:2)

这样做的方法是: - 将所有者名称作为字符串嵌入到房屋文档中。 house对象将同时具有owner_id(以便您可以获取完整所有者doc)以及仅使用所有者名称作为字符串的额外字段。 您只需在更改owner_id时更改名称,并且可以在1更新中完成,因此它是一致的。 使用它将是一个非常有效的查询,因为它不需要查看集合和文档的读取。 下行使用了更多的内存。

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

  • 一个极端的解决方案是嵌入所有这些文档:帽子在所有者内部,所有者在屋内。

最好的, AG