我还没有找到一个问题,正好问这个问题。我有一个User表和一个Person表。用户有一个人代表用户的个人详细信息。但是,用户可能还有几个人与之关联。
想想类似于macOS Contacts应用程序的内容。 macOS用户在联系人列表中有一个联系人,其中包含用户的个人详细信息。用户还有几个代表其他人的联系人。
用户有一个指向用户个人详细信息的外键person_id
。
Person有一个外键owner_id
,指向拥有该占位符的用户。表示用户的人具有空owner_id
。
好的,所以我创建了两个模型:
class User < ApplicationRecord
belongs_to :person
has_many :people, foreign_key: :owner_id
end
class Person < ApplicationRecord
has_one :user
belongs_to :user, foreign_key: :owner_id
end
我发现一个问题,我不确定如何处理。当我将owner_id
设置为用户ID的人员添加时,Active Record会更新用户person_id
。我看到执行了以下SQL查询:
INSERT INTO "people" (...) VALUES (...) RETURNING "id"
UPDATE "users" SET "person_id" = $1, "updated_at" = $2 WHERE "users"."id" = $3
我尝试在inverse_of
中更加明确地定义关联,但这没有帮助。唯一有效的方法就是从Person类中删除关联。这很好,但我真的想要理解我认为我在说什么和Rails认为我想要的东西之间的脱节。
添加迁移:
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users, id: false do |t|
t.primary_key :id, :uuid
t.string :username, null: false, unique: true
t.uuid :person_id, null: false
...
t.timestamps
end
end
end
class CreatePeople < ActiveRecord::Migration[5.0]
def change
create_table :people, id: false do |t|
t.primary_key :id, :uuid
t.uuid :owner_id
...
t.timestamps
end
add_foreign_key :people, :users, column: :owner_id, on_delete: :restrict
add_foreign_key :users, :people, column: :person_id, on_delete: :restrict
end
end
Jacob Vanus得到了答案。我需要更改关联的名称,如下所示:
class User < ApplicationRecord
belongs_to :person, class_name: 'Person', foreign_key: :person_id
has_many :contacts, class_name: 'Person', foreign_key: :owner_id
end
class Person < ApplicationRecord
has_one :user, class_name: 'User', foreign_key: :person_id
belongs_to :owner, class_name: 'User', foreign_key: :owner_id
end
答案 0 :(得分:1)
我认为问题在于您是否尝试将2个关系命名为同一个问题。尝试在两个类中重命名所有权关系。
class User < ApplicationRecord
belongs_to :person
has_many :owners, foreign_key: :owner_id, class: "Person"
end
您与Person
class Person < ApplicationRecord
has_one :user
belongs_to :owner, foreign_key: :owner_id, class: "Person"
end
我在尝试找出哪种关系时遇到了麻烦,因此您可能需要根据您的数据模型进行调整。