0

假设我有下表的用户

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

这将代表下图:

连接图

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

我希望能够输入类似 ab 的东西来生成所有与“a”相连的“B”,以及 ba 来生成所有与“b”相连的“A”。

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

感谢您的时间

4

1 回答 1

0

看起来像has_many :throughand的一个非常标准的例子STI

鉴于:

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对象将具有不同的属性集,那么您应该使用多态关联,这需要创建更多的表,但实际上并不会使事情复杂化。

于 2013-05-23T00:49:31.453 回答