我有两个模型:User
和Listing
。
我试图通过现有的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
非常感谢你!
答案 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
字段。