Каков наилучший способ справиться с четырехсторонним отношением между двумя моделями? - PullRequest
3 голосов
/ 09 марта 2012

У меня есть две модели: Компания и Пользователь

Это ситуация:

  • Компания может следовать за другой компанией
  • Пользователь может следовать за компанией
  • Пользователь может следовать за другим пользователем

Каков наилучший способ определения отношений и как будет выглядеть модель объединения?

Кроме того, есть ли лучшие практики для решения таких ситуаций?

Обновление

Извините, что не упомянул об этом ранее.Мне известны различные доступные типы отношений.У меня вопрос , который лучше всего подходит ?

Ответы [ 3 ]

3 голосов
/ 09 марта 2012

Что касается вашего вопроса, я бы посоветовал вам посмотреть пару видео Railscasts:

  1. http://railscasts.com/episodes/47-two-many-to-many
  2. http://railscasts.com/episodes/154-polymorphic-association

И это очень хорошо описано на сайте RubyonRails

Я бы сказал, посмотрите это для вашего случая:

  1. http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association
  2. http://guides.rubyonrails.org/association_basics.html#the-has_and_belongs_to_many-association

Надеюсь, это поможет вам.

2 голосов
/ 09 марта 2012

Благодаря полиморфным ассоциациям мы можем поместить все отношения в одну таблицу, которая выглядит так:

create_table :follows do |t|
        t.references :followable, :polymorphic => true
        t.references :followed_by, :polymorphic => true
end

Тогда модели:

class User < ActiveRecord::Base
    has_many :following_objects, :class_name => 'Follow', :as => :followed_by
    has_many :followed_objects, :class_name => 'Follow', :as => :followable
end

class Company < ActiveRecord::Base
    has_many :following_objects, :class_name => 'Follow', :as => :followed_by
    has_many :followed_objects, :class_name => 'Follow', :as => :followable
end

class Follow < ActiveRecord::Base
    belongs_to :followable, :polymorphic => true
    belongs_to :followed_by, :polymorphic => true
end

Извините за уродливые имена.

1 голос
/ 09 марта 2012

Основной идеей было бы использование двух самосвязанных ассоциаций:

  • Пользователь -> Дружба <- Пользователь </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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...