2009-12-15 62 views
3

我正在爲發票/客戶/合同數據庫編寫相當簡單的Web界面。 我想爲我的模型結構如下:與Rails中的遺留表格的複雜連接

class Invoice < ActiveRecord::Base 
    set_table_name 't10_invoices' 
    set_primary_key 'id_invoice' 
    has_one :client 
end 

class Client < ActiveRecord::Base 
    set_table_name 't20_clients' 
    set_primary_key 'id_client' 
    has_many :invoices 
end 

的問題是,我有以下的數據庫結構:

Tables: 
t10_invoices: 
    id_invoice - primary_key 
    id_contract - foreign_key 


t12_contracts: 
    id_contract - primary_key  

t15_contracts_clients 
    id_client - foreign_key 
    id_contract - foreign_key 

t20_clients 
    id_client - primary_key 

有通過t15_contracts_clientst20_clientst12_contracts之間的關係1-1 並且在t20_clientst10_invoices之間存在1-n關係。

:foreign_key:association_foreign_key有什麼區別?

問題是,我無法修改數據庫的結構,我在重新定義表名,外鍵,join_foreign_keys等方面相當迷茫...... 我想要一個簡單的方法來查找客戶的發票正常的導軌方式Invoice.find(:first).client

我將不勝感激任何建議和幫助。

回答

2

創建一個ContractClient加入模型以對應於t15_contracts_clients表。這指定表名,並使用了2個外鍵belongs_to協會:

class ContractClient < ActiveRecord::Base 
    set_table_name 't15_contracts_clients' 
    belongs_to :client, :foreign_key => :id_client 
    belongs_to :contract, :foreign_key => :id_contract 
end 

指定表和主鍵爲Client

class Client < ActiveRecord::Base 
    set_table_name 't20_clients' 
    set_primary_key 'id_client' 
end 

使用在發票上一個belongs_to :contract_client然後has_one :through關聯的通過ContractClient客戶端:

class Invoice < ActiveRecord::Base 
    set_table_name 't10_invoices' 
    set_primary_key 'id_invoice' 
    belongs_to :contract_client, :foreign_key => :id_contract 
    has_one :client, :through => :contract_client 
end 

Invoice.find(:first).client應該再behav如預期的那樣。

1

您是否考慮過創建數據庫view

+0

是的,我想創建視圖但我更願意在rails中完成所有操作 - 所以它會更加靈活,而不是讓DBA創建視圖。 – 2009-12-16 10:04:04

+0

我明白了。在我的團隊中,我們也在維護數據庫,所以我總是傾向於使用視圖消除數據庫不一致,並儘可能保持我的應用程序邏輯清潔。如果您有機會正確重寫數據庫架構,也很有用。 但是,視圖通常不可編輯,所以應該牢記這一點。 – 2009-12-16 12:45:20

2

你在模型中有幾個古怪的東西。它不是以客戶has_one合同的方式設置的。它在中間有一個連接表,允許每個客戶端有多個合同。由於您無法更改表格,因此最好只強制執行代碼中的任何關係。由於該表格顯然沒有主鍵,因此您可能需要使用has_and_belongs_to_many。在這種關係類型,:association_foreign_key是「其他」類,而:foreign_key是因爲你是在類。

class Invoice < ActiveRecord::Base 
    set_table_name 't10_invoices' 
    set_primary_key 'id_invoice' 
    belongs_to :contract, :foreign_key => 'id_contract' 
    has_one :client, :through => :contract 
end 

class Contract 
    set_table_name 't12_contracts' 
    set_primary_key 'id_contract' 
    has_and_belongs_to_many :clients, 
          :join_table => 't15_contracts_clients' 
          :foreign_key => 'id_contract', 
          :association_foreign_key => 'id_client' 
    has_many :invoices, :foreign_key => 'id_contract' 
end 

class Client < ActiveRecord::Base 
    set_table_name 't20_clients' 
    set_primary_key 'id_client' 
    has_and_belongs_to_many :clients, 
          :join_table => 't15_contracts_clients' 
          :foreign_key => 'id_client', 
          :association_foreign_key => 'id_contract' 
    has_many :invoices, :through => :contracts 
end 

然後,您需要調用

Invoice.find(:first).client