Rails 5中按指定列顺序查询数据结果顺序不符问题排查
问题分析与解决
问题原因
你遇到的情况是因为ActiveRecord实例的属性显示顺序由数据库表的字段定义顺序决定,而非select语句中指定的字段顺序。即使你的SQL查询里字段顺序是id, last_name, first_name,ActiveRecord在构建对象时,还是会按照模型对应数据库表中字段的定义顺序(比如表结构里first_name在last_name前面)来排列属性展示顺序。
另外,你的select写法可以简化:不需要用map(&:inspect)拼接,直接传数组Post.select(x)即可,Rails会自动处理字段的SQL引用。
解决方案
方案1:返回按指定顺序排列的哈希数组(推荐,无需ActiveRecord对象时用)
如果不需要保留ActiveRecord实例,只是需要按指定顺序获取数据,可以将查询结果转换为哈希数组,Rails 5+的哈希会保持插入顺序:
x = ["id", "last_name", "first_name"] @posts = Post.select(x).map { |post| x.index_with { |col| post.send(col) } }
返回结果会是:
[ { id: 215, last_name: "Wills", first_name: "Jack" }, { id: 216, last_name: "Denny", first_name: "Ross" } ]
方案2:自定义方法按指定顺序输出ActiveRecord对象属性
如果必须保留ActiveRecord实例,可以在Post模型里添加一个方法,用来按指定顺序返回属性:
class Post < ApplicationRecord def ordered_attributes(attr_order) attr_order.index_with { |attr| self[attr] } end end
使用时:
x = ["id", "last_name", "first_name"] @posts = Post.select(x) @posts.each do |post| puts post.ordered_attributes(x) end
内容的提问来源于stack exchange,提问作者user12763413
相关产品推荐
相关产品推荐

