0

これが皆さんにとって興味深いものです...

「Dogs」と「Trips」の間にHABTM(has_and_belongs_to_many)の関係があります。私の目標は、2つの結果セットを見つけることです。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

何か案は?ありがとう!-カム

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 に答える