我正在尝试创建一个自联接表,该表表示可以相互推荐的客户列表(可能是产品或程序)。我试图将我的模型限制为一个类,“客户”。
TL;DR在底部可用。
架构是:
create_table "customers", force: true do |t|
t.string "name"
t.integer "referring_customer_id"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "customers", ["referring_customer_id"], name: "index_customers_on_referring_customer_id"
我的模型是:
class Customer < ActiveRecord::Base
has_many :referrals, class_name: "Customer", foreign_key: "referring_customer_id", conditions: {:referring_customer_id => :id}
belongs_to :referring_customer, class_name: "Customer", foreign_key: "referring_customer_id"
end
访问客户的referring_customer 没有问题:
@customer.referring_customer.name
...返回引用@customer 的客户的名称。
但是,在访问引用时,我不断得到一个空数组:
@customer.referrals
...返回 []。
我运行 binding.pry 来查看正在运行什么 SQL,假设客户有一个“推荐人”并且应该有几个推荐人。这是正在执行的 SQL。
Customer Load (0.3ms) SELECT "customers".* FROM "customers"
WHERE "customers"."id" = ? ORDER BY "customers"."id"
ASC LIMIT 1 [["id", 2]]
Customer Exists (0.2ms) SELECT 1 AS one FROM "customers"
WHERE "customers"."referring_customer_id" = ? AND
"customers"."referring_customer_id" = 'id' LIMIT 1
[["referring_customer_id", 3]]
我有点迷茫,不确定我的问题出在哪里。我不认为我的查询是正确的——@customer.referrals 应该返回一个包含所有推荐的数组,这些推荐是具有@customer.id 作为其referring_customer_id 的客户。
TL;DR是否可以仅使用一个类进行自我连接?如果是这样,我如何设置我的条件和外键,以便我的查询为我提供 has_many 关系的正确数据?