回答

收藏

Rails select子查询(如果可能,不使用finder_sql)

技术问答 技术问答 117 人阅读 | 0 人回复 | 2023-09-13

我有一个称为“对象”的模型(这并不重要)# t1 ], B, _4 N6 I3 H5 N9 n
它具有默认价格(列称为“价格”)。
( W5 [0 d4 G; m然后是一个Schedule对象,该对象可以覆盖特定日期的价格。1 z7 d2 x( e/ j
我希望能够在SQL查询期间确定MINIMUM价格(根据定义,它是默认价格和“当前”价格之间的MINIMUM),以便能够按计算出的最低价格进行订购
# n* r1 ?; c) b( y我想让我的搜索查询尽可能高效,我想知道是否可以做这样的事情:
" a  v3 o! i& @& Y7 YObject.select("id AS p_id, id, (SELECT MIN(`schedules`.`price`) FROM `schedules` WHERE `schedules`.`object_id` = p_id`) AS objects.min_price").limit(5)$ f* F4 ]5 t: J, ?% Q
但是,它会生成一个奇怪的SQL,如下所示:
* H/ P4 J7 |7 e8 m8 c7 XSELECT `objects`.`id` AS t0_r0, `objects`.`title` AS t0_r1, `objects`.`created_at` AS t0_r2, `objects`.`updated_at` AS t0_r3, `objects`.`preferences` AS t0_r4 ........ (a lot of columns here) ... ` WHERE `objects`.`id` IN (1, 2, 3, 4 ....)
7 ]5 u( L7 u) e' v; B6 P) b8 L) _% n" M
因此,如您所见,它不起作用。首先-它加载了对象表中的所有列,其次-它看起来很可怕。3 J3 M. S" K1 k& ~0 \* n
我不想使用finder_sql的原因是我有很多可选参数和东西,因此在获取结果本身之前,强烈建议使用AR :: Relation对象。
" T! D+ B) x/ b- s$ T8 R除了上面提到的以外,我在数据库中还有很多记录,我认为将它们全部加载到内存中并不是一个好主意,这就是我想要执行此子查询的主要原因-. w: {* F' |, N. E
只是为了过滤掉尽可能多的记录。5 R% D* H/ }, t' n
有人可以帮助我如何更有效地做到这一点吗?) u1 s  p) `" B' j
               
2 V0 _1 D5 E4 M0 x- y2 Y4 B* \6 @解决方案:
  B8 D% p# P/ s; @; j" q               
( E3 O) v% J# Z& G! G* x5 j$ N9 A6 d

" x7 |0 \/ f7 g% c" W. s                如果分别生成子查询并使用联接而不是相关的子查询,则可以使此操作更容易:
  N* ~: X+ }* r6 vsubquery = Schedule.select('MIN(price) as min_price, object_id')6 J2 C$ t$ {: P, U# K
                   .group(bject_id)
% t' E2 E4 m5 }$ D% x- r/ }: k                   .to_sql
& R( W2 C4 y0 eObject.joins("JOIN (#{subquery}) schedules ON objects.p_id = schedules.object_id")
4 [- v7 \  ?) b      .select('objects.*, schedules.min_price')
' b" s8 K; I% C      .limit(5)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则