Основной идеей было бы использование двух самосвязанных ассоциаций:
- Пользователь -> Дружба <- Пользователь </li>
- Компания -> Партнерство <- Компания </li>
модели / user.rb
has_many :friendships
has_many :friends, :through => :friendships
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
has_many :inverse_friends, :through => :inverse_friendships, :source => :user
модели / дружба.rb
belongs_to :user
belongs_to :friend, :class_name => "User"
модели / company.rb
has_many :partnerships
has_many :partners, :through => :partnerships
has_many :inverse_partnerships, :class_name => "Partnership", :foreign_key => "partner_id"
has_many :inverse_partners, :through => :inverse_partnerships, :source => :company
models / partnership.rb
belongs_to :company
belongs_to :partner, :class_name => "Company"
и одна связь «многие ко многим» :
- Пользователь -> CompanyUser <- Company </li>
модели /user.rb
has_and_belongs_to_many :companies
models / company.rb
has_and_belongs_to_many :users
Так что для этой реализации вам понадобятся 5 таблиц (пользователи, дружба, компании, партнерства и companies_users), если вы используете СУБД.
Вы можете получить хороший пример этого скриншота:
http://railscasts.com/episodes/163-self-referential-association