2010-05-05 5 views
0

est ici intéressante pour vous les gens ...HABTM vérification de la correspondance des 3 dernières

J'ai un HABTM (has_and_belongs_to_many) relation entre « Dogs » et « Voyages ». Mon but est de trouver deux ensembles de résultats: 1) Les chiens qui ont été au moins 1 des 3 derniers voyages et appellent cela @dogs_current 2) Les chiens qui n'ont pas été sur l'un des 3 derniers voyages et appellent cela @dogs_old

Je trouve que je peux trouver ce que les 3 derniers voyages sont en faisant cela dans le modèle de voyage:

named_scope :last3, :order => 'date DESC', :limit => 3 

mais pas sûr de savoir comment utiliser cette liste se 1 et 2. ce hack fonctionne, mais il semble moche. Il doit y avoir un meilleur moyen! :)

@dogs_current = [] 
@dogs_old = [] 
@dogs.each do |dog| 
    if (Trip.last3 - dog.trips).size < 3 then 
    @dogs_current << dog 
    else 
    @dogs_old << dog 
    end 
end 

Des idées? Merci! -Cam

Répondre

0
class Trip < ActiveRecord::Base 
    has_and_belongs_to_many :dogs 
    named_scope :last3, :order => 'date DESC', :limit => 3 
end 

class Dog < ActiveRecord::Base 
    has_and_belongs_to_many :trips 
end 

#IDs of last 3 trips 
last_trips_ids = Trip.last3.collect(&:id) 

# I'm assuming your join table is `dogs_trips`. 
@dogs_current = Dog.all(:joins => :trips, 
    :conditions => ["dogs_trips.trip_id IN (?)", last_trips_ids]).uniq 

@dogs_old = Dog.all(:joins => :trips, 
    :conditions => ["dogs_trips.trip_id NOT IN (?)", last_trips_ids]).uniq 

Je crois que c'est correct. Au moins travaillé ici pour moi ...

+0

Cela semble très proche. Il a rencontré une erreur avec dogs_trips.id que j'ai dû modifier dans dogs_trips.trip_id dans la section conditions. Le seul problème avec le résultat était qu'il me donne plusieurs valeurs pour chaque chien pour chaque voyage où ils étaient. Si un chien était sur les 3 derniers voyages, ils sont retournés 3 fois. Peut-être que je peux ajouter un paramètre "unique" quelque part? – Cameron

+0

Désolé, mon erreur! J'ai édité ma réponse. Les résultats dupliqués étaient dus aux 'jointures '. –

+0

Après avoir effectué vos dernières modifications, cela fonctionne très bien pour dogs_current. Cependant, le code est le même pour les dogs_old. Est-ce que ce devrait être quelque chose comme "NOT IN (?)" Pour ça? J'ai essayé cela, mais le résultat a été mélangé avec des chiens qui étaient et n'étaient pas dans les 3 derniers voyages. Toute aide appréciée! :) – Cameron