Rails:具有动态表名称的ActiveRecord不区分大小写的排序?

时间:2017-03-02 16:09:26

标签: ruby-on-rails ruby sorting activerecord case-insensitive

[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) }

该表不能硬编码到方法中,因为它是用于几个不同表的抽象类。

有没有办法像ActiveRecord一样获取表名?

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

有没有办法一起使用符号列名和LOWER,让ActiveRecord扩展表名?

编辑:在上一个示例中使用反引号而不是双引号修复拼写错误。

1 个答案:

答案 0 :(得分:1)

ActiveRecord为模型提供table_name方法。

所以

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

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

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