【问题标题】:How to have two foreign key references to the same model in Active Record migration?如何在 Active Record 迁移中对同一模型有两个外键引用?
【发布时间】:2017-06-29 16:15:00
【问题描述】:

我正在使用 Rails 4。我有一个用户模型。现在我想创建一个名为 Follow 的新模型。表 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 中可以这样做,请也发表评论。

我不是在问如何设置模型。这个问题只涉及到数据库中的迁移和建表。

【问题讨论】:

  • 试试t.references :followed_user, index: true, foreign_key: true, class_name: 'User'
  • 这不起作用。我收到错误PG::UndefinedTable: ERROR: relation "followed_users" does not exist

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


【解决方案1】:

尝试像这样更改您的迁移:

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.

【讨论】:

  • 您在create_table 中有def up?您是否尝试过运行此迁移?我对设置模型不感兴趣。我的问题只是关于迁移。
【解决方案2】:

如果不存在followed_users 表,则无法使用t.references 语法创建followed_user_id 列。即使您可以使用该语法,您仍然必须在模型中设置关联。

如果您创建 2 列并为它们添加索引会有什么问题:

class TestFollowing < ActiveRecord::Migration
  def change
    create_table :following do |t|
      t.integer :user_id, index: true
      t.integer :folowed_user_id, index: true
    end
  end
end

【讨论】:

    猜你喜欢
    • 2017-10-24
    • 2010-10-07
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 2012-02-28
    • 2016-04-23
    • 1970-01-01
    相关资源
    最近更新 更多