2015-09-16 6 views
0

У меня есть модельКак выбрать все последние записи модели на основе атрибута?

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",  

Я хочу сферу, которая возвращает последний журнал для каждого уникального ключа, а именно журналы с идентификатором 3, 5, 6 утверждая, что яблоки кислые, апельсины круглые, а бананы - желтые.

Я хотел бы сделать это на стороне базы данных, но не хватает знаний, я могу только представить себе рубинового решение на стороне с неэффективного цикла

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

Излишне говорить, зацикливание над все уникальные ключи будут расти медленно поскольку содержимое таблицы увеличивается и, самое главное, возвращает массив, а не объект ActiveRecord :: Relation.

Можно ли это сделать с помощью SQL?

+0

Log.find (3,5,6) – emaillenin

+0

Смазливая, но это тривиализованный пример. Фактическая база данных содержит сотни ключей в случайном порядке. – Epigene

+1

Что вы сделали/попробовали? –

ответ

1

Вы можете использовать метод вычисленным в активной записи: http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-calculate Ваш пример довольно много матчей пример, приведенный здесь:

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

Но это только даст вам хэш ключевые ценности. Затем можно срывать ID и передать его в где:

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

Это будет по-прежнему делать два запроса, но это все же лучше, чем цикл через все, и масштабируемой.

+0

Это работает! Бонусные баллы для решения всех рельсов. – Epigene

0

Попробуйте

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

На что-то, но это, похоже, возвращает только идентификаторы и ключевые поля Logs, где мне нужны все атрибуты. – Epigene

Смежные вопросы