【问题标题】:Rails, Arel, Ransack: sort_by sum of relationRails,Arel,Ransack:sort_by 关系总和
【发布时间】:2016-04-23 12:54:50
【问题描述】:
class Document
  has_many :lines
end

class Line
  belongs_to :document
end

sort_by @q, :total

您好,我需要按行的总和(行中的金额列)对文档进行排序。

我想到了一个ransacker,但是如何正确写呢?

ransacker :total do
  parent ???
end

【问题讨论】:

    标签: ruby-on-rails ruby arel ransack


    【解决方案1】:

    您可能需要考虑计算任何Line 对象的after_create 和after_destroy 的总行数,并将其存储在documentsline_count 列中。这将使查询速度显着加快,并使数据易于查看。也请查看Rails counter caching,它实现了这一点,而您不必自己考虑所有回调。

    但是,您也可以通过使用 COUNT 和 GROUP BY 来执行此操作。这是一个快速的:

      ransacker :line_count do
        query = "(SELECT COUNT(lines.id) FROM lines WHERE lines.document_id = documents.id GROUP BY lines.document_id)"
        Arel.sql(query)
      end
    

    【讨论】:

    • 举个例子,在我的应用程序的数据库中,一个等效的查询需要 4.5 秒才能获得按计数降序排序的第一条记录。这个数据库在每个连接表中都有超过一百万行,但它说明了这个问题。如果将行数存储在documents 表中,则查询既易于理解又极快。
    • 我有 this 一些与赏金相关的问题。你想试一试吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 2011-10-15
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多