【问题标题】:Rails: Order by sum of two columnsRails:按两列之和排序
【发布时间】:2011-10-30 07:32:25
【问题描述】:

所以,我有一个Photo 模型,可以在full_size 和presentation_size 下载。当用户下载照片时,我会在照片的 full_downloads 和 presentation_downloads 属性上进行跟踪。

这一切都很好。

有时我想知道总共有多少下载量。我有一个简单的方法,total_downloads,看起来像这样:

def total_downloads
  self.full_downloads + self.presentation_downloads
end

我的问题是:我希望能够按所有这三个(完整、演示、总下载)订购照片。前两个很容易,但是如何通过两列的总和进行排序?请注意,这至少需要同时兼容 SQLite 和 PG。

一个附带的问题,将total_downloads 方法作为查询会更快吗?如果是这样,最好的写法是什么?我知道对你可以调用 Photo.sum(...) 的类进行求和,但我不确定如何对一条记录上的两列进行求和。

谢谢!

【问题讨论】:

  • 您可以直接编写 SQL 还是会成为问题?
  • @Devin M - 我会做我该做的:)

标签: sql ruby-on-rails ruby-on-rails-3 activerecord sql-order-by


【解决方案1】:

你可以试试这个:

Photo.order('full_downloads + presentation_downloads')

它将运行这个 SQL 查询:

SELECT "photos".* FROM "photos" ORDER BY full_downloads + presentation_downloads

虽然这可能很慢。如果您有一个大型数据集并且经常使用这种排序顺序,您应该考虑创建一个total_downloads 列,并在记录的full_downloads 或presentation_downloads 列发生变化时重新计算其值。

【讨论】:

    【解决方案2】:

    Photo.order('full_downloads + presentation_downloads DESC')

    这肯定比在 Ruby 中进行排序要快得多。

    【讨论】:

      【解决方案3】:

      您现在可能必须添加Photo.order(Arel.sql('full_downloads + presentation_downloads')) 以避免UnknownAttributeReference error

      【讨论】:

        猜你喜欢
        • 2020-07-25
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-19
        相关资源
        最近更新 更多