假设我有以下用户表
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”类型的用户的foreign_key索引(即'这些用户是类型“A”),同样对于“B”,在这种情况下我可以只需通过连接表从“A”到“B”定义一个简单的has_many关联,反之亦然。
我希望能够键入类似ab的内容来生成'a'所连接的所有“B”,以及生成'b'所连接的所有“A”。< / p>
我的问题是:“A”和“B”之间的这种多对多关联是否可以使用单个用户模型来定义?可以使用自联接吗?
感谢您的时间
答案 0 :(得分:0)
看起来像是has_many :through
和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
如果您的AUser
和BUser
对象具有不同的属性集,那么您应该使用Polymorphic Associations代替,这需要创建更多的表,但实际上并没有太多复杂化。