Ransack按关系总和排序

时间:2017-11-20 19:10:21

标签: ruby-on-rails ransack

我正在使用Ransack按不同的属性对项目表(模型项目)进行排序,其中一个属性是某个项目的销售总小时数(思考咨询),需要从中总结出来每次销售。

有没有办法实现这个目标?相关代码如下。

class Project < ApplicationRecord    
  has_many :sales, -> { order(:date) }, inverse_of: :project, dependent: :destroy
end

class Sale < ApplicationRecord
  belongs_to :project, inverse_of: :sales, touch: true
  validates :hours, numericality: { only_integer: true }
end

class ProjectsController < ApplicationController
  def index
    @q = Project.ransack(params[:q])
    @projects = @q.result
  end
end

视图中的排序链接应如下所示:

<th><%= sort_link(@q, <SUM_OF_SOLD_HOURS>, 'Hours') %></th>

更新

通过在Project模型中实现一个ransacker来解决它,如果有人遇到类似的问题,请在下面编写代码。

  ransacker :total_hours do
    query = "(SELECT SUM(hours) FROM sales WHERE sales.project_id = projects.id GROUP BY sales.project_id)"
    Arel.sql(query)
  end

0 个答案:

没有答案