两个字段与表中的外键 - Rails

时间:2015-07-30 04:32:25

标签: ruby-on-rails ruby postgresql ruby-on-rails-4

我正在尝试使字段user_id和following_id具有用户ID字段的引用表。我已经尝试过所有东西,已经搜索过互联网但仍然不能。

迁移:

    class CreateFollowers < ActiveRecord::Migration
  def change
    create_table :followers do |t|
      t.references :user, index: true, foreign_key: true
      t.references :following, index: true, foreign_key: true

      t.timestamps null: false
    end
  end
end

型号:

class Follower < ActiveRecord::Base
  belongs_to :user, :class_name => 'User'
  belongs_to :following, :class_name => 'User'
end

class User < ActiveRecord::Base
  has_many :follower1_as_user, :class_name => 'Follower', :foreign_key => 'user_id'
  has_many :follower2_as_user, :class_name => 'Follower', :foreign_key => 'following_id'
end

我甚至阅读了文档,我总是看着代码,我认为我是对的。

2 个答案:

答案 0 :(得分:1)

您的模型和表格设计存在问题。您有一个跟随另一个用户(2)的用户(1)。所以,1是追随者,2是追随者。

如果2也决定跟随1怎么办?

你将有一个这样的表:

关系

id / follower_id / followeed(或以下)_id

1 / 1_id / 2_id

2 / 2_id / 1_id

你需要通过可逆的关系来实现这一点。对于初学者来说是一个非常复杂的应用程序。幸运的是,有一个完美的书籍指南,可能需要你几天。看看Michael's Hartl guide

你需要的就是那里。

答案 1 :(得分:1)

reference方法不支持表名与引用名称不匹配的表的外键。

解决方案可能是用更少的Rails魔法来构建相同的东西:

def change
  create_table :followers do |t|
    t.references :user,         index: true, foreign_key: true
    t.integer    :following_id, index: true
    t.timestamps null: false
  end
  add_foreign_key :followers, :users, column: :following_id
end

此外,Follower模型中的关联声明也需要了解非显而易见的列名称:

class Follower < ActiveRecord::Base
  belongs_to :user
  belongs_to :following, class_name: 'User', foreign_key: 'following_id'
end