我想使用外国人将数据库级别(Postgres)的位置表链接到以下结构。
我有一个客户端表,其中包含各种客户端的名称,我有一个包含两列的作业表:一列用于源客户端,另一列用于终端客户端。
每个工作都有两个不同的客户。
源客户端和最终客户端将不同,因此源客户端的外键将存储在其自己的列中,目标客户端的外键也将存储在其自己的列中。
所以我的问题是:如何使用外国人建立这种关系?或者我只是接近这个错误?
答案 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
列
这应该适用于您对任务的描述