class Box embeds_many :things after_init :add_default_things def add_default_things self.things.build(Title: "Socks",value: 2) self.things.build(Title: "Ring",value: 1) endendclass Thing fIEld :Title fIEld :value,type: Integerend
所有的盒子都有一些默认的东西:袜子和戒指.每个人都可以将这个或另一个东西添加到一个盒子里.所以现在我需要按袜子的数量订购所有盒子:
Box.order_by(:thing_with_Title_socks.value.desc) # ???解决方法 我不擅长ruby,所以我将尝试用java术语来解释它.问题是你如何设计数据.例如,你有n个Box类,每个类都有一个项目列表:
public class Box { public List<Item> items;}public class Item { public String name; public int value;}
要对这个类中的所有框进行排序以获取特定的项目值,您需要循环遍历所有项目中的所有项目.所以我会改变我的代码来更有效地做到这一点:
public class Box { public Map<Integer,Item> items;}public class Item { public int ID; public String name; public int value;}
这样我会检查项目是否存在于框中;访问具有O(1)复杂度的items值,我不会错误地在我的盒子中放入2个不同的袜子包,这会导致错误(哪一个会排序?).
您当前的数据结构如下:
{ things : [ {"name" : "socks","value" : 2},{"name" : "ring","value" : 5} ]}
但是如果您要对“已知”对象(如戒指或袜子)进行排序/直接访问(在查询中使用),那么您的数据应如下所示:
{ things : { "socks": 2,"ring" : 5 }}
如果你有额外的信息附加到这些项目,他们也可以看起来像:
{ things : { "S01" : { "name" : "super socks","value" : 1 },"S02" : { "name" : "different socks","value" : 2} }}
这样您就可以直接访问框中的项目.
希望这会有所帮助.
编辑:我认为这很明显但只是为了清楚地说明:除非你知道确切的位置,否则你无法有效地查询“列出的”子数据. (你总是可以使用map / reduce)
总结以上是内存溢出为你收集整理的ruby-on-rails – Mongoid:按嵌套子值排序全部内容,希望文章能够帮你解决ruby-on-rails – Mongoid:按嵌套子值排序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)