Rails、Arel、Ransack:sort_by 关系之和

Rails, Arel, Ransack: sort_by sum of relation

class Document
  has_many :lines
end

class Line
  belongs_to :document
end

sort_by @q, :total

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

我想到了一个掠夺者,但是怎么写才好呢?

ransacker :total do
  parent ???
end

您可能需要考虑计算任何 Line 对象的 after_create 和 after_destroy 的总行数,并将其存储在 [=13] 上的 line_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