如何根据属性选择所有最新的模型条目?

时间:2015-09-16 11:55:08

标签: sql ruby-on-rails rails-activerecord

我有一个模特

class Log < ActiveRecord::Base
  attr_accessible :key, :value
end

鉴于此日志表:

id: 1, key: "apple", value: "tasty", 
id: 2, key: "apple", value: "green",  
id: 3, key: "apple", value: "sour",  
id: 4, key: "orange", value: "juicy",  
id: 5, key: "orange", value: "round",  
id: 6, key: "banana", value: "yellow",      

我想要一个范围,它返回每个唯一键的最后一个日志,即id为3, 5, 6的日志,肯定苹果是酸的,橙子是圆形的,香蕉是黄色的。

我想在数据库方面这样做,但缺乏知识我只能想象一个循环效率低的ruby端解决方案

Log.all.pluck(:key).uniq.map {|key| Log.where(key: key).last }

毋庸置疑,循环遍历所有唯一键会随着表内容的增加而变慢,最重要的是会返回一个数组,而不是ActiveRecord :: Relation对象。

这甚至可以用SQL完成吗?

2 个答案:

答案 0 :(得分:1)

您可以在有效记录中使用计算方法:http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-calculate 你的例子非常符合那里给出的例子:

values = Log.group(:key).maximum(:id)

但这只会给你一个关键值的哈希值。然后你可以将ID读取并传递到where:

values = Log.where(id: Log.group(:key).maximum(:id).values)

这仍然可以进行两次查询,但它仍然比循环遍历所有并且可扩展。

答案 1 :(得分:0)

尝试

Log.find_by_sql("SELECT DISTINCT(key) FROM logs
ORDER BY created_at DESC")