2014-08-29 71 views
0

我想用外國人將數據庫級別(Postgres)的位置表與以下結構鏈接起來。Rails:使用老外寶石的同一張表的外鍵

我有一個客戶端表與各種客戶端的名稱,我有一個作業表有兩列:一個用於源客戶端,一個用於最終客戶端。

每個工作將有兩個不同的客戶端。

源客戶和最終客戶會有所不同,因此對於源客戶端外鍵將被存儲在自己的專欄,併爲目標客戶端外鍵將被存儲在自己的列也是如此。

所以我的問題:我如何使用外國人建立這種關係?或者我剛剛接近這個錯誤?

回答

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 

我做了這些類的名字,你真的不討論「端客戶端」和「源客戶端」之間的角色差異,但這會給你誰的更好的感覺做什麼。

+0

我已經與辯論我。我的意圖是讓系統儘可能地靈活,因爲客戶可以是出發地或目的地。 分段來分成兩個不同的類別並不一定是件壞事,但如果客戶在兩個表中存在,它可能會更有點惱人,使他們都在一起(尤其是客戶表將持有如地址其他信息,電話等 – webo 2014-08-29 14:46:21

+0

聽起來像客戶端可以具體的工作中有作用。難道我的理解是正確的? – Anthony 2014-08-29 14:55:07

+0

因此,一個更好的辦法來想它會像在出貨。有一個發送者和每個作業的接收方。任何客戶端可以是發送者和任何其他客戶端可能是收件人。 – webo 2014-08-29 15:02:02

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列 這應該爲你的任務的描述工作