2

我正在尝试创建一个自联接表,该表表示可以相互推荐的客户列表(可能是产品或程序)。我试图将我的模型限制为一个类,“客户”。

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 关系的正确数据?

4

1 回答 1

4

这个关联定义

has_many :referrals, class_name: "Customer", foreign_key: "referring_customer_id", conditions: {:referring_customer_id => :id}

不太对。无需定义条件子句——这就是 has_many 的重点。它应该是:

has_many :referrals, class_name: "Customer", foreign_key: "referring_customer_id" 

这将使用客户表上的 refering_customer_id 列。

于 2013-11-06T03:59:06.793 回答