我有一个graphs
表,其中包含字段name
和version
。每次插入记录时,如果数据库中不存在名称,则版本为0
,否则为max(version) + 1
。我想获得每个唯一名称具有最高版本的记录列表。以下代码执行此操作:
def self.latest_versions
Graph.group(:name).maximum(:version).map{ |k,v| find_by name: k, version: v}
end
但是我想知道是否有一种更快的方法可以使用仅仅链接活动记录关系的范围来做到这一点?
答案 0 :(得分:1)
这个怎么样
def self.latest_versions
name_versions = Graph.group(:name).maximum(:version).map {|k,v| [k,v].join(';')}
Graph.where("concat(name, ';', version) IN (?)", name_versions)
end
获取name, version
组后,将其转换为数组,将2列连接成1,通过组合列查询,我们只需要另外一个sql查询,总共2个,比现有查询要好得多