0

似乎没有适用于这种模式的关联序列:

每个用户都持有对同一个表中两个 OTHER 用户的引用。

该表包含两个名为和的User字段。我一直在尝试使以下模型关联起作用:user_a_iduser_b_id

class User < ApplicationRecord
    has_one :user_a, class_name: "User", foreign_key: "user_a_id"
    has_one :user_b, class_name: "User", foreign_key: "user_b_id"
end

参考只需要在一个方向上工作。我只是想通过以下方式使用模型:

user.user_a.name
user.user_b.name

我永远不需要访问user_a.parent_user. 我不需要那种关系。

当我self.user_abefore_save回调中引用时会出现问题。我基本上得到了一个 SQL 查询的递归循环,最终给了我一个stack too deep错误。

有谁知道这里发生了什么?

4

2 回答 2

2

我只是尝试了您想要实现的目标。这是users 表的迁移:

create_table :users do |t|
  t.string :name
  t.references :user_a
  t.references :user_b

  t.timestamps
end

请注意这如何生成以下schema.rb

create_table "users", force: :cascade do |t|
  t.string "name"
  t.integer "user_a_id"
  t.integer "user_b_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.index ["user_a_id"], name: "index_users_on_user_a_id"
  t.index ["user_b_id"], name: "index_users_on_user_b_id"
end

在用户模型中,我有

class User < ApplicationRecord
  has_one :user_a, class_name: "User", foreign_key: "user_a_id"
  has_one :user_b, class_name: "User", foreign_key: "user_b_id"
end

迁移后,我可以执行rails console以下操作:

User.create(
  name: "inception_user",
  user_a: User.create(name: "Adam"),
  user_b: User.create(name: "Berta")
)

inception_user = User.find_by_name "inception_user"

inception_user.user_a.name
=> "Adam"

inception_user.user_b.name
=> "Berta"

使用此设置一切正常。如果您还有问题,请发表评论!
有关自加入的更多信息:http: //guides.rubyonrails.org/association_basics.html#self-joins

于 2017-05-27T20:24:51.133 回答
0

终于找到了解决办法。这可能是一个极端情况,但我需要使用belongs_to而不是,has_one我需要id从我的表中删除foreign_key. 另外,因为我将引用存储在before_save回调中,并且在验证期间它们会是空的,所以我需要添加参数optional: true。这是使我的程序能够可靠运行的唯一关联:

class User < ApplicationRecord
    belongs_to :user_a, class_name: "User", foreign_key: "user_a", optional: true
    belongs_to :user_b, class_name: "User", foreign_key: "user_b", optional: true
end

希望这可以帮助某人!

于 2017-05-28T21:51:48.940 回答