我正在开发一款可以帮助我跟踪财务状况的应用。有一个模型可以跟踪我的投资账户(例如401k等)以及与每个账户相关的月度余额。 investment_accounts模型has_many余额,余额belongs_to investment_accounts。
我希望该应用程序现在跟踪债务,特别是我的抵押贷款。但我正在努力弄清楚如何最好地模拟这个?我需要有一个抵押贷款模型,其中包含的信息不同于investment_accounts(特别是利率)。但抵押贷款模型应该利用余额表,因为跟踪抵押贷款余额与追踪投资账户余额非常相似。但我对如何修改余额表以使其足够灵活地为抵押权表和投资资产表提供服务感到茫然。
我考虑在余额模型上添加'type'属性并创建这样的命名范围:
scope :investment_accounts, where(type: 'investment')
scope :mortgage, where(type: 'mortgate')
但后来我意识到这应该导致一些奇怪的ActiveRecord查询。例如:
investment_accounts.balances.investment_accounts
和
mortgage.balances.mortgage
我认为这是一种代码味道。有关如何做到这一点的任何建议吗?
答案 0 :(得分:1)
polymorphic association
就是这种情况。
class InvestmentAccount < ActiveRecord::Base
has_many :balances, as: :balanceable
end
class Mortgage < ActiveRecord::Base
has_many :balances, as: :balanceable
end
class Balance < ActiveRecord::Base
belongs_to :balanceable, polymorphic: true
end
这样,您的余额将会有一列balanceable
,其中存储了“investment_account”,“抵押贷款”等类型,以及更多内容。
# Usage
account = InvestmentAccount.last
account.balances
mortgage = Mortgage.last
mortgage.balances
balance = Balance.last
balance.balanceable # Will return object according to its balanceable
有关多态及其迁移的更多信息,请查看指南:http://guides.rubyonrails.org/association_basics.html#polymorphic-associations
答案 1 :(得分:1)
余额可能只有一些可选字段,仅在需要时使用。或者您可以使用STI使Balance成为超类,然后为每种类型创建子类。因此,您可能有一个MortgageBalance和一个其父级为Balance的InvestmentAccountBalance类。它们共享同一个表,具有类型字段,并允许模型根据其类型进行区分。但我不确定这是否必要。您可能只能保持松散并使用鸭子打字。 mortgage.balances
将为抵押贷款量身定制余额,甚至可能不需要知道差额。与Mortgage对象的关系可能会产生差异。有意义吗?