我正在使用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