首页 > 解决方案 > 如何使用 ransack gem 根据模型的实例方法对表进行排序?

问题描述

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

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 实例方法进行排序。根据文档,似乎使用 ransacker 是要走的路。像这样的东西:

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

在视图中:

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

但我无法让 Arel 工作。这里的查询是什么让这个工作,或者有没有使用 Arel 的另一种方法?

标签: ruby-on-railsransackarel

解决方案


你可以这样做:

# 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

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


推荐阅读