Rails: ActiveRecord 使用动态 table 名称进行不区分大小写的排序?

Rails: ActiveRecord case-insensitive sort with dynamic table name?

[ Rails: ActiveRecord db sort operation case insensitive ] 显示如何使用 ActiveRecord 执行不区分大小写的排序。

Rails: ActiveRecord db sort operation case insensitive

Table.order("lower(column) DESC")

我正在使用的代码需要将列名表示为一个符号,以便 ActiveRecord 会自动将其扩展为 "table"."column"。这是必需的,因为某些查询包含具有不明确列名的连接语句。

GitLab CE: app/models/concerns/sortable.rb#L19-20

scope :order_name_asc, -> { reorder(name: :asc) }
scope :order_name_desc, -> { reorder(name: :desc) }

table 不能硬编码到方法中,因为它是一个抽象 class 用于多个不同的 table。

有没有办法像 ActiveRecord 那样获取 table 名称?

scope :order_name_asc, -> { reorder(%Q{LOWER("#{???}"."name") ASC}) }
scope :order_name_desc, -> { reorder(%Q{LOWER("#{???}"."name") DESC}) }

有没有办法把符号列名和LOWER一起使用,让ActiveRecord扩展table这个名字?


编辑: 修正了最后一个例子中使用反引号而不是双引号的拼写错误。

ActiveRecord 为模型提供 table_name 方法。

所以

class User < ActiveRecord::Base
end
User.table_name
#=> "users"

因此,这可以在范围内使用:

scope :order_name_asc, -> { reorder(%Q{LOWER("#{table_name}"."name") ASC}) }