如何在Active Record迁移中对同一模型进行两次外键引用?

时间:2017-06-29 16:15:01

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-3.2 ruby-on-rails-5

我正在使用Rails 4.我有一个用户模型。现在我想创建一个名为Following的新模型。表followings将包含user_idfollowed_user_id列,它们是引用users表中记录的外键。

我有一个Active Record迁移来创建followings表,比如

class CreateFollowings < ActiveRecord::Migration
    def change
        create_table :followings do |t|
            t.references :user, index: true, foreign_key: true
        end
    end
end

这将创建列user_id。如何使用t.references语法创建followed_user_id列?

这不是Rails 4特有的问题。因此,如果在Rails 5或Rails 3中可以实现这一点,请同时发表评论。

我不是在询问如何设置模型。此问题仅涉及迁移和在数据库中设置表。

2 个答案:

答案 0 :(得分:0)

尝试更改您的迁移:

class CreateFollowings < ActiveRecord::Migration
  create_table :followings do |t|
    def up
      t.references :user, index: true, foreign_key: true
      t.references :followed_user, index: true, foreign_key: true
    end
  end
end

你的模型中也应该有相同的belongs_to关系。 因此,在模型中添加以下关联。

遵循模式:

class Following < ActiveRecord::Base
  belongs_to :user, class_name => 'User'
  belongs_to :followed_user, class_name => 'User'
end

用户模型:

class User < ActiveRecord::Base
  has_many :users, :class_name => 'Following', :foreign_key => 'user_id'
  has_many :followed_users, :class_name => 'Following', :foreign_key => 'followed_user_id'
end

下面创建外键的另一种方法:

def change
  add_foreign_key :followings, :users, column: :followed_user_id
end

Api dock here.

答案 1 :(得分:0)

如果不存在this.route.snapshot.parent.parent.data['project']表,则无法使用t.references语法创建followed_user_id列。即使您可以使用该语法,仍然必须在模型中设置关联。

如果您创建2列并为其添加索引,则会出现什么问题:

followed_users