У меня есть модель в базе данных. Модель имеет 3 ключа интереса:
создал_, тип, ключ
- создал_, это, ну, отметка времени
- является известным перечислением.
- ключ соответствует соглашению, но в целом он неизвестен и не уникален.
Возможно, существуют сотни записей с заданным типом и комбинацией клавиш, и записи могут быть не маленькими. Я стараюсь максимально не загружать их из базы данных.
Проблема состоит в том, чтобы эффективно найти последнюю версию объекта (без необходимости удалять старые версии). Я хочу получить последнюю запись из базы данных для каждого ключа типа, но я не знаю, что это за ключи. Запрос состоит в том, что я даю тип, и в итоге получаю хеш объектов [key => object], где объект, который я выбираю для хэша, - это самый новый объект (самое последнее значение create_at) с этой парой ключей.
Моей первой мыслью было сделать это в памяти
# this is pseudo code, have not compiled
models = Model.where(:type => :some_type).order("created_at desc")
result = models.inject(Hash.new) {|r, m| r[m.key] = m unless r.has_key? m.key}
Но это станет ужасно большим, когда я масштабируюсь. Вторая мысль - получить все ключи, а затем запросить все модели. Что-то вроде:
keys = Model.where(:type => :some_type).select("DISTINCT key").map{|m| m.key }
result = keys.inject(Hash.new) {|r, k| r[k] = Model.where(:type => :some_type).where(:key => k).order("created_at").last; r }
Но, когда я пишу этот код, я просто продолжаю думать, должен быть лучший способ . Это решение помогло бы мне сделать много запросов к базе данных по мере роста. В какой-то момент мне все равно придется закрыть ключи, так что, если вы можете предложить решение, которое позволит мне ограничить / разбить на страницы результаты, еще лучше.
Итак, есть ли способ сделать это более эффективно? Может быть, магический поисковый параметр в Arel или ключевое слово в SQL, о котором я забыл?