2016-08-05 84 views
0

我正在致力于一个客户可以获得贷款的项目,该项目将分成n 分期付款多对多关联的设计模式,附加字段和部分满意

客户将付款付款

class Instalment 
    has_and_belongs_to_many :payments 
end 

class Payment 
    has_and_belongs_to_many :instalments 
end 

他可以支付全部贷款或分期付款单,但这个想法是他能够买任何种类的数量的。

这意味着一些分期付款将被部分支付。

我不知道如何在代码中表达这一点。

例如,客户得到50美元的贷款,将分5次分期付款10美元。客户决定支付25美元两次。

Instalment 
-------------- 
ID | quantity 
1 |  10$ 
2 |  10$ 
3 |  10$ 
4 |  10$ 
5 |  10$ 

Payment 
---------------------- 
ID | quantity 
1 |  25$ 
2 |  25$ 

Instalments_Payments 
---------------------- 
payment_id | instalment_id 
     1 |    1 
     1 |    2 
     1 |    3 # note that this instalment_id and next one 
     2 |    3 # are the same, but we don't know how much quantity it satisfied in each one. 
     2 |    4 
     2 |    5 

我有两个想法,但我不喜欢任何人:

添加在Instalments_Payments表中的两个新领域。如果分期付款已全部付清,而其他付款已付完,则会标记。

Instalments_Payments 
---------------------- 
payment_id | instalment_id | full_paid | paid 
     1 |    1 |  true | 10$ 
     1 |    2 |  true | 10$ 
     1 |    3 |  false | 5$ 
     2 |    3 |  false | 5$ 
     2 |    4 |  true | 10$ 
     2 |    5 |  true | 10$ 

添加在付款has_many :partial_payments

我寻找这个问题的最好的办法的新模式PartialPayments。

回答

1

如果你想要时间效率,那么你应该在数据库表中创建一个记录状态的列,这将在更好的性能水平上提供频繁的查询。这是常见的解决方案。

否则,您可能会创建一个帮助函数,以比较客户应该支付的钱与他已付的钱,这会在运行时消耗更多时间。

由于在大多数情况下时间比空间更珍贵,我们通常选择记录状态并在后台异步执行比较,因此用户不需要等待完成运行时操作。因此,第一种解决方案通常是首选。

+0

在哪个表中? –

+0

您的意思是我提出的关于创建full_paid和付费列的建议? –

+0

@FranMartinez是的。这是常见的解决方案。 – knh190