Obter Últimos Itens da Associação Muitos para Muitos

Olá a todos! recentemente me deparei com o problema de devolver os últimos itens criados em uma associação muitos para muitos, eu tinha estes modelos:

class Resource < ActiveRecord::Base
has_many
:prospections
end
class Location < ActiveRecord::Base
has_many
:prospections
end
class Prospection < ActiveRecord::Base
belongs_to
:location
belongs_to
:resource
attr_accessible
:amount, :prospection_date
end

Portanto, cada recurso tem muitas perspectivas para um determinado local, cada um com diferentes quantidades e datas, pode haver também muitos recursos em um único local. O que eu precisava obter era a quantidade atual de cada Recurso em um Local com base na última prospecção daquele Recurso naquele Local.

Depois de tentar vários métodos (muitos com uniq, uma cláusula where) para fazer isso sem muito sucesso, descobri que poderia fazer isso agrupando as Prospecções pelo ID do recurso e fazendo com que tivesse a Data máxima de Prospecção (Você poderia usar a criado no campo se você tiver um cenário semelhante, onde você não tem um campo de data específico)

Esta é a associação que estou usando para o modelo de localização:

has_many :current_prospections, :class_name => "Prospection", :group => "resource_id", :having => "MAX(prospection_date)"

da mesma forma, isso é o que eu adicionei no modelo de recurso:

has_many :current_prospections, :class_name => "Prospection", :group => "location_id", :having => "MAX(prospection_date)"

Agora posso iterar essas coleções e verei apenas a última prospecção para determinados recursos. Levei muito pesquisar no Google para encontrar essa solução, então decidi escrever uma dica.

Para resumir, quando você precisa obter os últimos elementos criados de uma associação has_many que tem IDs duplicados, você deve agrupar pelo ID duplicado e adicionar uma cláusula having para filtrar apenas o elemento com a data MAX.

Recursos:

Referência de associação has_many