以下是一些可能有用的资源:
-
RailsCasts 第 163 集自我参照协会 http://railscasts.com/episodes/163-self-referential-association?view=asciicast关于自引用多对多关系
-
RailsCasts 集 #47 两个多对多 http://railscasts.com/episodes/47-two-many-to-many。这可能与您想要实现的目标更相关
- 有人使用 HABTM 为自我参照关系创建的要点 https://gist.github.com/srpouyet/4121517
我将总结在这些链接中找到的信息:
鉴于您正在描述自引用多对多关系,您当然会得到一个连接表。通常,应该特意以这样的方式命名连接表,以便 Rails 会自动找出该表正在连接哪些模型,但是“自引用”部分使这有点尴尬,但并不困难。您只需指定连接表的名称以及连接列。
您需要使用可能如下所示的迁移来创建此表:
class CreateFriendships < ActiveRecord::Migration
def self.up
create_table :friendships, id: false do |t|
t.integer :user_id
t.integer :friend_user_id
end
add_index(:friendships, [:user_id, :friend_user_id], :unique => true)
add_index(:friendships, [:friend_user_id, :user_id], :unique => true)
end
def self.down
remove_index(:friendships, [:friend_user_id, :user_id])
remove_index(:friendships, [:user_id, :friend_user_id])
drop_table :friendships
end
end
我不确定是否有创建此表的快捷方式,但至少您可以简单地执行rails g migration create_friendships
,并填写self.up
and self.down
方法。
最后在您的用户模型中,您只需添加连接表的名称,如下所示:
class User < ActiveRecord::Base
has_and_belongs_to_many :friends,
class_name: "User",
join_table: :friendships,
foreign_key: :user_id,
association_foreign_key: :friend_user_id
end
正如您所看到的,虽然数据库中确实有一个联接表,但没有相关的联接模型。
请告诉我这是否适合您。