15

我想创建一个Users有很多friends类的结构User

class User < ActiveRecord::Base
  has_and_belongs_to_many :friends, class_name: "User"
end

我不需要他们关系的任何细节,因此我不使用:through那种类Friendship。但是现在我找不到任何方法来创建相应的数据库(无论是使用迁移文件还是使用rails g model User username:string ...命令)。有任何想法吗?

4

1 回答 1

39

以下是一些可能有用的资源:

我将总结在这些链接中找到的信息:

鉴于您正在描述一个自引用的多对多关系,您当然会得到一个连接表。通常情况下,连接表应该被有意命名,这样 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.upandself.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

如您所见,虽然您在数据库中有一个连接表,但没有相关的连接模型。

请让我知道这是否适合您。

于 2013-11-04T17:15:55.080 回答