首页 > 解决方案 > 在rails activeadmin中对多个连接table_for进行排序

问题描述

嗨,我尝试在 rails 上对列进行排序,activeadmin。代码就是这样。

# app/admin/users.rb
show do
  tab do
    table_for do
      # here comes my columns

我可以从Sort a table_for in rails activeadmin 中找到一个好的排序解决方案。所以我尝试了这段代码,它可以工作。

# app/admin/users.rb
show do
  tab do
    table_for user.supports.order(params[:order].gsub('_', ' ')), sortable: true do
      column 'step', sortable: :step do |support|
        support.step
      end

但是如何在同一个 table_for 中对这一列进行排序?

# app/admin/users.rb
column 'date', sortable: 'payment.date' do |support|
  support.payment.date
end

我尝试了很多东西,但无法做到。我的型号代码如下。

# app/models/payment.rb
class Payment < ApplicationRecord
  belongs_to :support
# app/models/support.rb
class CampaignSupport < ApplicationRecord
  belongs_to :user
  has_many :payment
# app/models/user.rb
class User < ApplicationRecord
  has_many :support

谢谢

标签: ruby-on-railsactiveadmin

解决方案


这是您可以做的事情的一个例子(即使它不理想......):

# app/admin/users.rb
show do
  tab do
    # Use `split` in case you have columns like `created_at` (which won't work with `gsub('_', ' ')`)
    # In case `params[:order]` isn't defined, `step DESC` is the default order
    split_order = params[:order]&.split('_') || ['step', 'desc']
    order_direction = split_order.pop
    order_column = split_order.join('_')
    supports =
      user
        .supports
        .joins('LEFT JOIN payments ON payments.support_id = supports.id')
        .order(order_column => order_direction)

    table_for supports, sortable: true do
      column 'step', sortable: :step { |support| support.step }
      column 'date', sortable: 'payments.date' { |support| support.payment.date }
    end
  end
end

推荐阅读