【发布时间】:2013-02-14 04:19:56
【问题描述】:
我有一组记录,其中一些(但不是全部)具有“路径”字段,并且所有记录都具有“值”字段。我希望只选择那些没有路径,或者在具有特定路径的所有记录中具有最大值的那些。
也就是说,给定这些记录:
Name: Path: Value:
A foo 5
B foo 6
C NULL 2
D bar 2
E NULL 4
我想返回 B、C、D 和 E,而不是 A(因为 A 有一条路径,它的路径与 B 相同,但 A 的值较小)。
如何使用 ActiveRecord、ARel 和 Postgres 完成此任务?理想情况下,我想要一个充当范围的解决方案。
【问题讨论】:
-
如果不使用 ActiveRecord,您将在 5 分钟内获得 3 个 SQL 工作答案。
-
同意,现在是回归真正 SQL 的好时机。
-
拥有 AR 示波器解决方案有多重要? ActiveRecord 对数据库和 SQL 的理解相当原始和有限,因此它在处理比
select * from t where ...更复杂的任何事情时都会遇到问题,您需要比这更高级的东西才能获得可靠的结果。你的数据有什么限制吗?如果数据受到限制,我们可能会想出一些类似于范围的东西。 -
@muistooshort 目前我只是加载所有记录并拒绝 Ruby 中价值较低的记录。这冒犯了我的效率意识。我不反对 SQL 解决方案,我只是希望能够将其视为可链接范围(
User.things.highest_path_values.where()等),结合使用 AR 预加载,等等。我不确定哪种数据约束有用 - 值是浮点数,路径是字符串(或 null),并且每条记录都分类了与过滤过程无关的其他数据。 -
“因为我们不懂 SQL,所以全部用 Ruby 做”是 Rails 的典型特征,这也是数据库人对 ActiveRecord 如此嗤之以鼻的原因之一;你是对的 (IMO) 被这种方法的代价冒犯了。当你可以按自己的方式做事时,Rails 很好,但当你不能时,它很快就会崩溃。直接的解决方案涉及一个窗口函数、一个派生表和一个 UNION,而 ActiveRecord 不太喜欢这些东西。通过约束,我正在考虑唯一性约束。让我再考虑一下。
标签: ruby-on-rails-3 postgresql rails-activerecord arel groupwise-maximum