在现有列上创建ActiveRecord关联

时间:2018-03-21 07:53:20

标签: ruby-on-rails associations rails-activerecord

我有两个模型:UserListing。 我试图通过现有的db列建立它们之间的一对多关系。

class User < ApplicationRecord
  has_many :listings

class Listing < ApplicationRecord
   belongs_to :user, foreign_key: "user_id"

这是我的迁移:

class AddFkToListing < ActiveRecord::Migration[5.1]
  def change
    add_foreign_key :listings, :users, column: :user_id, primary_key: :user_id
  end
end

但它在列users的表id中创建了外键。 知道如何正确地做到这一点吗?

以下是数据库架构:

  create_table "listings", force: :cascade do |t|
    t.integer "listing_id"
    t.string "state"
    t.integer "user_id"
    t.string "title"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["listing_id"], name: "index_listings_on_listing_id", unique: true
  end

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "password_digest"
    t.string "remember_digest"
    t.boolean "admin", default: false
    t.string "activation_digest"
    t.boolean "activated", default: false
    t.datetime "activated_at"
    t.string "reset_digest"
    t.datetime "reset_sent_at"
    t.string "request_token"
    t.string "request_secret"
    t.string "oauth_verifier"
    t.string "oauth_token"
    t.string "login_name"
    t.integer "user_id"
    t.index ["email"], name: "index_users_on_email", unique: true
  end

非常感谢你!

1 个答案:

答案 0 :(得分:1)

由于您有一个传统的外键字段名称(user_id表中的listings),我相信这应该对您有用:

class AddFkToListing < ActiveRecord::Migration[5.1]
  def change
    add_foreign_key :listings, :users
  end
end

add_foreign_key的语法是:

  • 第一个参数(:listings) - 应包含外键的表
  • 第二个参数(:users) - 应该用于约束的表
  • column: :user_id - 指定应该应用listings表约束的哪个字段
  • primary_key: - 指定用于构建约束的users表的字段

(见https://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_foreign_key

示例中的primary_key: :user_id部分实际上引用(尝试)user_id表中不存在的users字段。