处理2个模型之间4路关系的最佳方法是什么?

时间:2012-03-09 07:16:47

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我有两个模型:公司用户

情况就是这样:

  • 公司可以关注其他公司
  • 用户可以关注公司
  • 用户可以关注其他用户

定义关系的最佳方式是什么?连接模型的外观如何?

此外,在解决此类情况时是否有任何最佳做法?

更新

对不起,早些时候没有提到过。我知道可用的各种关系类型。我的问题是'哪个最合适'

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

由于多态关联,我们可以将所有关系放在一个表中,如下所示:

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

抱歉丑陋的名字。

答案 2 :(得分:1)

一个基本想法是使用两个自引用关联:

  • 用户 - &gt;友谊&lt; - 用户
  • 公司 - &gt;伙伴关系&lt; - 公司

<强>模型/ 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

models / friendship.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"

一对多关联:

  • 用户 - &gt;公司用户&lt; - 公司

models / user.rb

has_and_belongs_to_many :companies

models / company.rb

has_and_belongs_to_many :users

因此,对于此实现,如果您使用的是RDBMS,则需要5个表(用户,友谊,公司,合作伙伴和公司用户)。

你可以在这个截屏视频中找到一个很好的例子:

http://railscasts.com/episodes/163-self-referential-association