如何使用搜索 gem 根据模型的实例方法对 table 进行排序?

How do I use the ransack gem to sort a table based on a model's instance method?

我正在使用 Rails 和掠夺者 gem (2.3.2) 构建一个可按列名过滤的 table。我想根据该帐户电子邮件地址的第一个成员来过滤该帐户。模型和实例方法如下所示:

class Account
 has_many :members

 def first_member_email
   members.order(created_at: :desc).first.email
 end
end

class Member
 belongs_to :account
end

我打算使用 Ransack 的“sort_link”根据帐户的 first_member_email 实例方法进行排序。基于 documentation 看来使用掠夺者是可行的方法。像这样:

ransacker :first_member_email do |parent|
      Arel.sql(something)
 end

并且在视图中:

th=sort_link @q, :first_member_email, 'Created By'

但我无法让 Arel 工作。这里的查询是什么来让它工作,或者有没有不使用 Arel 的其他方法?

你可以这样做:

# app/models/account.rb

class Account < ApplicationRecord
  scope :sort_by_first_member_email_asc, -> { sort_by(&:first_member_email) }
  scope :sort_by_first_member_email_desc, -> { sort_by(&:first_member_email).reverse }
end

如果需要,您可以在范围内编写自定义查询。谢谢:)