Rails 如何在 controllers 中让查询数据按某种规则展示在页面中

LPFpengfei · 2018年02月02日 · 最后由 tooyee 回复于 2018年03月24日 · 1540 次阅读

整体的需求是这样的,User 表关联了一张支付的 payment 表,现在要将当月所有支付过用户按照支付总金额的从多到少排列展示,前十名用户还需要在展示的过程中追加 top1~10; 我在处理的时候是先查询 payment 表中的数据,找到当月的支付过的用户,然后根据用户去展示数据,其支付金额我在 user 的 modle 中写了一个计算金额的方法; 但是在页面显示中,我却无法将用户的展示按照金额的大小排列,其排列顺序默认是按照 user 表的 id 来排列的。我也曾按照简书中的方法去处理这些数据,但是这样又带来了一个新的问题,就是无法进行分页了。我现在很迷茫,谁有好点的方法能够帮到我吗?

代码如下,整体的需求就是这样。

def active_organizations
  start_date = params[:start_time]
  end_date = params[:end_time]
  records = Record.where(data_source: '交易订单').with_date_range(start_date,end_date)
  record_id = records.uniq.pluck(:organization_id)
  payments = Payment.pay_succeed.with_date_range(start_date,end_date)
  payment_id = payments.uniq.pluck(:organization_id)
  organizations = Organization.where(id: (record_id+payment_id).uniq)
  amount = organizations.map { |e| [e.id,records.where(organization_id: e.id).sum(:amount).abs + payments.where(organization_id: e.id).sum(:amount).abs] }
  ids = amount.sort{|a,b|b[1] <=> a[1]}.map { |e| e[0] }
  @organizations = organizations.find(ids).index_by(&:id).slice(*ids).values
end
User.joins(:payments)
  .select('users.id, SUM(payments.amount) AS payment_amount')
  .group('users.id')
  .order('payment_amount')
winse 回复

首先谢谢你的帮助,payment 记录的是 user 的每一次的支付金额,我需要的是 payment 的中本月,支付过得用户的,每一个用户的,支付金额的总额,所以这个金额是计算的,首先要对这个计算的金额进行排序,然后在查询 User 表时按照这个排序中的 user_id 的顺序查询 user 数据并展示

LPFpengfei 回复

按照你说的需求一楼正解啊,加个支付时间条件过滤一下本月的就行了。另外就算不采用一楼的方法 Kaminari 是可以对数组分页的。当然一楼方案最好。

你真是毁了 ruby 的思想啊!group 里加个时间分组就行了

LPFpengfei 关闭了讨论。 01月29日 16:39
需要 登录 后方可回复, 如果你还没有账号请 注册新账号