Полиморфные отношения должны делать большую часть того, что вам нужно, хотя, если ваши кошки и собаки дружат со свиньями, и вы хотите знать, кто инициировал дружбу, мое предыдущее решение слишком упрощено.
class Animal < ActiveRecord::Base
belongs_to :creatures, :polymorphic => true
named_scope :cats, :conditions => {:creature_type => 'Cat'}
named_scope :dogs, :conditions => {:creature_type => 'Dog'}
named_scope :pigs, :conditions => {:creature_type => 'Pig'}
end
class Cat < ActiveRecord::Base
has_many :friends, :as => :creatures
end
class Dog < ActiveRecord::Base
has_many :friends, :as => :creatures
end
class Pig < ActiveRecord::Base
has_many :friends, :as => :creatures
end
Это может быть не то, что вы хотите, но это позволит вам называть cat.friends и cat.friends.dogs, cat.friends.pigs и т. Д.
Вы можете добавлять has_manyассоциации, чтобы вы могли напрямую вызвать cat.dogs и cat.pigs.
class Cat < ActiveRecord::Base
has_many :friends, :as => :creatures
has_many :dogs, :through => :animal
has_many :pigs, :through => :animal
end
Я не уверен, что это то, что вы ищете, но я думаю, что это более простой способ пойти, и простой всегда лучше.