Rails 5:多个双向Active Record关联

时间:2018-01-08 18:47:31

标签: ruby-on-rails activerecord

我还没有找到一个问题,正好问这个问题。我有一个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

1 个答案:

答案 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

我在尝试找出哪种关系时遇到了麻烦,因此您可能需要根据您的数据模型进行调整。