【发布时间】:2023-03-27 03:00:01
【问题描述】:
我有一个规则构建器,它最终通过链接多个 where 调用来构建 ActiveRecord 查询,如下所示:
Track.where("tracks.popularity < ?", 1).where("(audio_features ->> 'valence')::numeric between ? and ?", 2, 5)
然后,如果有人想对结果进行随机排序,它会附加order("random()")。
但是,考虑到表的大小,random() 的排序效率极低,因此我需要使用 Postgres TABLESAMPLE-ing。
在原始 SQL 查询中,如下所示:
SELECT * FROM "tracks" TABLESAMPLE SYSTEM(0.1) LIMIT 250;
有没有办法将TABLESAMPLE SYSTEM(0.1) 添加到现有的 ActiveRecord 调用链中?将其放在 where() 或 order() 中不起作用,因为它不是 WHERE 或 ORDER BY 函数。
【问题讨论】:
-
我稍微研究了一下,向
Arel::Nodes::SelectManager添加全新的结构似乎很难做到。特别是在这种情况下,因为 TABLESAMPLE 必须位于查询的末尾。您可能想尝试在 Rails 核心开发人员邮件列表上提问,因为他们可能对 Arel 的深奥内部运作有一些见解。
标签: ruby-on-rails activerecord