我有一个模特
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完成吗?
答案 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")