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