Rails:使用外国人gem的同一个表中的外键

时间:2014-08-29 14:14:26

标签: ruby-on-rails ruby postgresql foreign-keys

我想使用外国人将数据库级别(Postgres)的位置表链接到以下结构。

我有一个客户端表,其中包含各种客户端的名称,我有一个包含两列的作业表:一列用于源客户端,另一列用于终端客户端。

每个工作都有两个不同的客户。

源客户端和最终客户端将不同,因此源客户端的外键将存储在其自己的列中,目标客户端的外键也将存储在其自己的列中。

所以我的问题是:如何使用外国人建立这种关系?或者我只是接近这个错误?

2 个答案:

答案 0 :(得分:0)

对我而言,这似乎是一种代码味道。客户端有两个角色来自您描述的内容,一个是“源客户端”,另一个是“最终客户端”。这有损于SRP single responsibility principal,这让我觉得这两个应该是单独的类。举个例子:

class Job < ActiveRecord::Base
  has_many :clients
  has_many :roles
end

class Client < ActiveRecord::Base
  has_many :jobs
  has_many :roles, through: :jobs
end

client Role < ActiveRecord::Base
  has_many :clients
end

我编写了这些类名,因为你没有真正讨论“终端客户”和“源客户”之间的角色差异,但这可以让你更好地了解谁做了什么。

答案 1 :(得分:0)

你可以这样做

class Client < ActiveRecord::Base
   has_many :source_jobs, class_name: 'Jobs', foreign_key: 'client_id' 
   has_many :end_jobs, class_name: 'Jobs', foreign_key: 'end_client_id'
end
class Job < ActiveRecord::Base
  belongs_to :client, as: :source_client
  belongs_to :end_client, class_name: 'Client'
end

然后在您的职位表中,您会看到client_id列和end_client_id列 这应该适用于您对任务的描述