ruby-on-rails – Mongoid:按嵌套子值排序

ruby-on-rails – Mongoid:按嵌套子值排序,第1张

概述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) endendcla
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:按嵌套子值排序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1272289.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存