单个模型中的多对多关联(rails)

时间:2013-05-22 23:29:43

标签: ruby-on-rails model-associations

假设我有以下用户表

id,键入
 1,“A”
 2,“B”
 3,“B”
 4,“A”
 5,“B”
 6,“A”

有两种用户类型。 “A”用户和“B”用户。 “A”可以连接到许多“B”,“B”可以连接到许多“A”。假设我们有以下“连接”表

id,A_id,B_id

1,1,2  2,4,2  3,4,3  4,6,5  5,1,5  6,4,5

这将代表以下图表:

connections graph

我可以有一个“A”表来存储具有“A”类型的用户的foreign_key索引(即'这些用户是类型“A”),同样对于“B”,在这种情况下我可以只需通过连接表从“A”到“B”定义一个简单的has_many关联,反之亦然。

我希望能够键入类似ab的内容来生成'a'所连接的所有“B”,以及生成'b'所连接的所有“A”。< / p>

我的问题是:“A”和“B”之间的这种多对多关联是否可以使用单个用户模型来定义?可以使用自联接吗?

感谢您的时间

1 个答案:

答案 0 :(得分:0)

看起来像是has_many :throughSTI的非常标准的例子。

假设:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :type

      t.timestamps
    end
  end
end

class CreateConnections < ActiveRecord::Migration
  def change
    create_table :connections do |t|
      t.integer :a_user_id
      t.integer :b_user_id

      t.timestamps
    end
  end
end

class User < ActiveRecord::Base
end

class AUser < User
  has_many :connections
  has_many :b_users, :through => :connections
end

class BUser < User
  has_many :connections
  has_many :a_users, :through => :connections
end

class Connection < ActiveRecord::Base
  belongs_to :a_user
  belongs_to :b_user
end

当(rails控制台输出为了简洁而剪断)时:

>> a_user = AUser.create!
>> b_user = BUser.create!
>> connection = a_user.connections.build
>> connection.b_user = b_user
>> connection.save!

然后:

>> a_user.b_users
=> ActiveRecord::Associations::CollectionProxy of BUsers

如果您的AUserBUser对象具有不同的属性集,那么您应该使用Polymorphic Associations代替,这需要创建更多的表,但实际上并没有太多复杂化。