2010-05-05 48 views
0

比賽這裏有一個有趣的爲你的鄉親......HABTM檢查的最新3

我有「狗」和「旅行」之間的HABTM(has_and_belongs_to_many)的關係。我的目標是找到兩個結果集: 1)最近3次旅行中至少有1次的狗,並稱其爲@dogs_current 2)最近3次沒有進行過任何行程的狗並將其稱爲@dogs_old

我發現,我能找到什麼樣的最後3個車次是由旅行模型做這個:

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

但不知道如何使用該名單得到1和2。這個技巧的作品,但它看起來很醜。一定會有更好的辦法! :)

@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 

任何想法?謝謝! -Cam

回答

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 

我相信這是正確的。至少在這裏爲我工作......

+0

這似乎很接近。它在dogs_trips.id中出現錯誤,我必須在條件部分更改爲dogs_trips.trip_id。 結果唯一的問題是,它給了我每個狗他們每次旅行的多個值。如果一隻狗在最後一次旅行的所有3次中都返回3次。也許我可以在那裏添加一個「獨特的」參數? – Cameron 2010-05-05 17:20:22

+0

對不起,我的錯!我編輯了我的答案。重複的結果是因爲「連接」。 – 2010-05-05 17:28:37

+0

經過你最後的編輯,它確實爲dog_current工作。但是,代碼對於dogs_old看起來是一樣的。它是否應該像「不在(?)」那樣?我嘗試了這一點,但結果卻與那些在過去的3次旅行中都沒有的狗混在一起。任何幫助感謝! :) – Cameron 2010-05-06 16:08:08