我正在为发票/客户/契约(Contract)数据库编写相当简单的 Web 界面。 我希望我的模型具有以下结构:
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
t20_clients
和 t12_contracts
到 t15_contracts_clients
之间存在 1-1 关系
t20_clients
和 t10_invoices
之间存在 1-n 关系。
:foreign_key
和 :association_foreign_key
有什么区别?
问题是我无法修改数据库的结构,而且我在重新定义表名、外键、join_foreign_keys 等时完全迷失了...
我想要一种以普通 Rails 方式找到发票客户的简单方法 Invoice.find(:first).client
如果有任何建议和帮助,我将不胜感激。
最佳答案
创建一个ContractClient
Join Model来对应t15_contracts_clients表。这指定表名并使用 belongs_to
关联 2 个外键:
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
在 Invoice 上使用 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
应该会按预期运行。
关于ruby-on-rails - 与 Rails 中的旧表进行复杂连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1908740/