我使用DataMapper (ruby gem)作为mysql数据库的ORM。(dm-core 1.1.0, do-mysql-adapter 1.1.0, do_mysql 0.10.6)
我正在编写一个有两个表的应用程序:一个是磁盘使用日志,一个是"当前使用"表,其中包含"最新"磁盘使用情况的外键,以便于参考。DataMapper类是Quota
和LatestQuota
,具有一个简单的模式:
在我的代码中,我想找到LatestQuota表中与百分比高于95的配额相对应的所有条目。我使用以下数据映射器查询:
<>之前配额= LatestQuota。All (:quota => {:percentage)。Gte => threshold})晚些时候…配额。选择{|问| some_boolean_function ?(问)}之前而some_booolean_function是以DataMapper无法知道的方式过滤结果的东西,因此我需要调用ruby的select()。
但它最终调用以下SQL查询(从DM的调试输出报告:)
SELECT ' unique_id ' FROM ' quota ' WHERE ' percentage '>= 95
之后:
SELECT ' quota_unique_id ' FROM ' latest_quota 'WHERE ' quota_unique_id ' IN (52,78,82,232,313,320 ....上面查询的所有唯一id…)之前这是一个荒谬的次优查询,所以我认为我做错了什么。
quota
表中有数百万条记录(历史数据),而latest_quota
中有15k左右的记录,首先选择所有quota
记录,然后从结果中选择latest_quota
记录,这是完全错误的方法。我希望它的效果是:
<>之前SELECT q.* from配额qINNER JOIN latest_quota lq在lq.quota_unique_id = q.unique_id
这需要0.01秒与我的当前数据,而不是5分钟左右,它需要DataMapper做它的查询。有办法强迫它做我想做的事吗?是我的亲戚搞错了吗?我问错了吗?
由于某些原因,嵌套哈希样式的查询总是执行子选择。要强制使用INNER join,请使用String查询路径: