HABTM проверяет соответствие последних 3 - PullRequest
0 голосов
/ 05 мая 2010

Вот интересный для вас, ребята ...

У меня есть отношение HABTM (has_and_belongs_to_many) между "Dogs" и "Trips". Моя цель - найти два набора результатов: 1) Собаки, которые были в по крайней мере 1 из последних 3 поездок и называют это @dogs_current 2) Собаки, которые НЕ были ни в одной из последних 3 поездок и называют это @ dogs_old

Я обнаружил, что могу узнать, что такое последние три поездки, выполнив это в модели Trip:

  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

1 Ответ

0 голосов
/ 05 мая 2010
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

Я считаю, что это правильно. По крайней мере, работал здесь для меня ...

...