【问题标题】:Which Active Record Association is more appropriate for these models?哪个 Active Record 关联更适合这些模型?
【发布时间】:2012-02-20 22:58:45
【问题描述】:

我一直在 RailGuides 上阅读有关 Active Record Associations 的内容,我发现它非常有用,但我在理解某些选择方面肯定需要帮助。还在学习中。

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

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

以及具有这些属性的连接表 CodeLines:

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 列为合同模型的属性之一是否合适当然,units alloc 属性在我的脑海中仍然是一个很大的问题,我该从哪里得到它?

任何帮助或指示都会很有帮助。

谢谢。

【问题讨论】:

    标签: ruby-on-rails-3 activerecord polymorphic-associations


    【解决方案1】:

    嗯,我试试看:)

    我了解,我们来自一份合同,该合同由一位客户签署,涉及一些“代码”。所以它可以是这样的:

    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
    

    您可以在其中将代码数量存储在特殊列中。当然,所有这些声明都必须通过适当的迁移来支持:) 我是不是把事情弄清楚了一点?

    【讨论】:

    • 谢谢@socjopata ...是的,你确实为我清理了事情,你的回复让我意识到我需要做更多的研究才能更好地理解这些关系。我可以在为代码、合同和客户端创建模型时创建这些迁移吗?再次感谢。,
    • 是的,基本上你可以使用 Rails 生成器。当您键入“rails g model Code”时,它将创建一个适当的类,以及它的示例迁移。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多