2012-02-20 20 views
0

我一直在阅读铁轨上的活动记录协会,我发现它非常翔实,但我肯定需要帮助理解一些选择。仍在学习。哪个Active Record Association更适合这些模型?

我有一个具有以下属性的客户端模式:

name 
birth_date 
address1 
etc 

然后,合同模式具有这些属性:

auth_num 
start_date 
end_date 
client_id .... I think I need this here for the new contract form 

此外,代码模型具有这些属性:

code_name 
status 
description 

我有一个连接表ClientLines具有这些属性:

Contract_id 
Client_id 

而且连接表的代码行具有这些属性:

Contract_id 
Code_id 
Client_id 
Units_Alloc ... each contract might use a combination of codes some of which are 
        the same in other contracts but they have different number of units 
        allocated. 

我忍不住要使用多态关联,因为合同模型与客户端模型和代码模型相关联的,但我没有信心足以继续进行设置,而不必先检查是否有人愿意为我列出的示例提供一些指导。

我的指导希望在于这些问题。

多态关联是我上面列出的模型示例的最佳选择吗?

由于合同使用不同的代码组合,但某些代码在其他合同中是相同的,唯一的区别是分配的单元数量,我是否在正确的表格中分配了单位? (本质上,我不知道在哪里放置单元分配?)

当我设置数据输入表单时,我可以输入新的合同,它将从客户表和代码表中提取特定属性,是否适当将Client_id列为合同模型的属性之一,当然单位alloc属性仍然在我的脑海里成为一个问题,我从哪里获得?

任何帮助或指示将是最有帮助的。

谢谢。

回答

0

好吧,我试试吧:)

我明白,我们来自一个合同,这是一个由一个客户端登录,是对一些“代码”。因此,它可以是这样的:

class Contract < ActiveRecord::Base 
has_one :client 
has_many :codes 
end 

class Client < ActiveRecord::Base 
belongs_to :contract 
end 

class Code < ActiveRecord::Base 
belongs_to :contract 
end 

你在哪里存储contract_id在客户表和码表。然后,你可以不喜欢AR操作:

contract = Contact.find_by_auth_num(1234) 
contract.client #gets you the client 
contract.codes #gets you contracted codes 
contract.codes.count #gets you number of contracted codes 

或者,如果你想让它更复杂,您可以的关系改变为

class Contract < ActiveRecord::Base 
has_one :client 
has_many :contract_codes 
has_many :codes, :through => :contract_codes 
end 

class Code < ActiveRecord::Base 
has_many :contract_codes 
has_many :contracts, :through => :contract_codes 
end 

ContractCode < ActiveRecord::Base 
belongs_to :code 
belongs_to :contract 
end 

中间模型,您可以存储特殊列中的代码数量。当然,所有这些声明都必须通过适当的迁移来支持:)我是否清理了一些东西?

+0

谢谢@socjopata ...是的,你确实为我清理了一些东西,你的回答让我意识到我需要做更多的研究才能更好地理解关系。我可以在创建代码,合同和客户端模型时创建这些迁移吗?再次感谢, – thomasvermaak 2012-02-21 16:28:53

+0

是的,基本上你可以使用rails generator。当你键入“rails g model Code”时,它将创建一个合适的类,并为它创建示例迁移。 – socjopata 2012-02-21 16:52:12