Rails模型在同一个表中保存了自己的类类型的几个引用

时间:2017-05-27 19:37:48

标签: ruby-on-rails database model associations ruby-on-rails-5.1

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

每个用户都拥有对同一个表中两个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_a回调中引用before_save时,会出现问题。我基本上得到一个SQL查询的递归循环,最终给我一个stack too deep错误。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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" 中执行以下操作:

function setLocation() {
  return new Promise((resolve, reject) => {
    // I do my stuff

    // I finished
    resolve();
  });
}

function myOrder() {
        setLocation().then(() => {
          $.post('http://111.111.111.111/order', {
                  Item: Chair,
                  Price: 50, 
                  Location: location;
                                                 })        
        })
}

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

答案 1 :(得分: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

希望这有助于某人!