【发布时间】:2019-08-11 05:24:19
【问题描述】:
考虑以下代表我的 Rails 项目的两个模型的模型图。
Implement 模型表示一个人拥有的“对象”,例如,一个人可以拥有头盔、包、盾牌等。从图中可以看出,每个工具都有一个级别,这意味着一个用户可以拥有 1 级头盔、2 级包、5 级盾牌等。另外重要的是要说一个人不能拥有两个相同类型的工具,所以一个人的记录不能有两个头盔。
我目前正在尝试解决的问题是使用 Mongoid 以这样的形式查询我的 MongoDB 数据库,以便我可以找到执行级别大于或等于给定级别的人。例如,我想要所有盾牌等级大于或等于 2 且头盔等级大于或等于 5 的 Person 记录。
目前,我的解决方案涉及一种蛮力方法,即循环所有 Person 记录并查看它们是否与我想要的实现有关系,这样做的问题是它效率低下并且在使用数千条记录进行此操作时无法扩展数据库。
required_bag_level = 2
required_helmet_level = 1
Person.select do |record|
record.implements.where(name: 'bag').first.level >= required_bag_level && record.implements.where(name: 'helmet').first.level >= required_helmet_level
end
我还尝试向 Person 对象添加一个一般级别,该级别由他拥有的每个工具级别的总和组成,例如,如果这个人有一个 2 级的包和一个 1 级的头盔,我给他一个一般级别3,然后在进行查询时,我会查找一般级别等于 3 的所有记录。
required_bag_level = 2
required_helmet_level = 1
total = required_bag_level + required_helmet_level
Person.where(general_level: total)
最后一种方法的问题在于它不适用于多种工具,例如,一个人的包级别为 2,另一个人的包级别为 1,头盔级别为 1,两者都具有一般级别 2。对于具有 2 级包的人,我会搜索所有具有 2 级一般记录的记录,这两个记录都给了我。这将是错误的,因为即使最后一条记录具有一般级别 2,他也只有包级别 1。
我想问是否有人可以为我指明正确的方向并帮助我找出可扩展的解决方案。谢谢。
【问题讨论】:
标签: ruby-on-rails mongodb database-design mongoid querying