【问题标题】:Creating ActiveRecord Associations on Existing Columns在现有列上创建 ActiveRecord 关联
【发布时间】:2018-03-21 07:53:20
【问题描述】:

我有两个模型: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

非常感谢!

【问题讨论】:

  • 它应该在listings表中添加了一个字段user_id,该字段引用了表usersid列——所以外键引用了用户的id列,听起来正确的?它可能更简单,但您的代码对我来说看起来是正确的(例如,不需要在 belongs_to 中指定外键)。
  • Listing类的关联中无需指定foreign_key: "user_id"。
  • 非常感谢。 Listing.user_id 列是传统的,但 User.user_id 是非常规的。现在它与 User.id 相关联。我已经更新了原始帖子中的数据库架构。有什么想法吗?

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


【解决方案1】:

由于您有一个常规的外键字段名称(listings 表中的user_id),我相信这对您来说应该可以正常工作:

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 部分实际上是指(尝试)到users 表中不存在的user_id 字段。

【讨论】:

  • 非常感谢。 Listing.user_id 列是传统的,但 User.user_id 是非常规的。现在它与 User.id 相关联。我已经更新了原始帖子中的数据库架构。有什么想法吗?
猜你喜欢
  • 2017-11-12
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
相关资源
最近更新 更多