0

这里有一个对你们来说很有趣的...

我在“狗”和“旅行”之间有 HABTM(has_and_belongs_to_many)关系。我的目标是找到两个结果集:1)最近 3 次旅行中至少有 1 次的狗并称其为 @dogs_current 2)最近 3 次旅行中没有任何一次的狗并称其为 @dogs_old

我发现我可以通过在 Trip 模型中执行此操作找到最后 3 次行程:

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

但不确定如何使用该列表获取 1 和 2。这个 hack 有效,但看起来很难看。一定会有更好的办法!:)

@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

有任何想法吗?谢谢!-凸轮

4

1 回答 1

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

我相信这是正确的。至少在这里为我工作...

于 2010-05-05T16:27:02.857 回答