似乎没有适用于此模式的关联序列:
每个用户都拥有对同一个表中两个OTHER用户的引用。
User
表包含两个名为user_a_id
和user_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
错误。
有谁知道这里发生了什么?
答案 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
希望这有助于某人!