【问题标题】:Rails: Update loan amount with amount paidRails:用支付的金额更新贷款金额
【发布时间】:2015-10-11 04:09:03
【问题描述】:

我对 Rails 很陌生,我写了一个跟踪贷款的小应用程序。有一个用户模型和一个贷款模型,我已经计算出跟踪谁借了谁的钱等等。

我正在尝试编写一个新功能来跟踪付款,但我不确定我应该把它放在哪里。此功能将使用新值更新贷款金额的数据库值。这个功能会是 Loan 类的一部分吗?它会是一个可以访问贷款/用户模型的新控制器吗?

如果这个问题过于含糊,我很抱歉,我可以提供更多信息。

【问题讨论】:

    标签: ruby-on-rails model-view-controller models controllers


    【解决方案1】:

    您可以在贷款模型make_payment(amount) 中创建一个方法,然后从总贷款金额中减少金额。

    我建议您保留付款日志,以便以后跟踪它们。创建一个属于Loan 模型的Payment 模型。

    【讨论】:

    • 您绝对应该至少将原始贷款金额与余额分开!
    • 谢谢!我不确定我是否需要一个单独的控制器。这个解决方案要简单得多(特别是因为这是供个人使用,而不是用于市场)。
    • 为了从网上更新贷款金额,我需要使用补丁请求吗?
    【解决方案2】:

    当您获得一笔不小的贷款时,常见的情况是您获得了一个分期付款的付款计划。

    每期可分多次付款。

    让我们看看模型的外观:

    class User < ActiveRecord::Base
      has_many :loans
      has_many :instalments, through: :loans
      has_many :payments, through: :loans
    end
    
    # [int, foreign_key, index] user_id
    # [float] total_amount - does not change!
    class Loan < ActiveRecord::Base
      belongs_to :user
      has_many :instalments
      has_many :payments
    end
    
    # [int, foreign_key, index] loan_id
    # [float] total_due
    # [float] payed
    # [datetime] due_date
    class Instalment < ActiveRecord::Base
      belongs_to :loan  
      has_one :user, through: :loan
      has_many :payments
    end
    
    # [int, foreign_key, index] instalment_id
    # [float] amount
    class Payment < ActiveRecord::Base
      belongs_to :instalment
      has_one :loan, through: :instalment
      has_one :user, through: :loan
    end
    

    这可能看起来过于复杂,但实际上足以承担某种财务责任。我们可以跟踪用户每个月应该支付多少 - 以及哪些支付与特定的分期付款相关联。如果您真的想真正使用这个应用程序,您很可能会遇到更多的法律责任要求(除非您的目标是瑞士市场)。

    让我们在这里谈谈应用程序流程:

    • 创建贷款时,我们会创建用户必须支付的分期付款。
    • 每次用户分期付款时,我们都会设置一个挂钩来更新分期付款的支付金额。
    • 我们还需要定期检查用户是否按时支付了分期付款。

    请注意,在此域模型中,我们不会在创建后更新贷款金额 - 它只是他们借入的原始金额的记录(请记住,出于会计目的,您应该始终保留数据)。

    我们不必计算还剩下多少贷款,而是将instalments.payed 列相加:

    # [int, foreign_key, index] user_id
    # [float] total_amount - does not change!
    class Loan < ActiveRecord::Base
      belongs_to :user
      has_many :instalments
      has_many :payments
    
      def payed
        installments.sum(:payed)
      end 
    
      def amount_due
        total_amount - installments.sum(:payed)
      end
    end
    

    这是您需要的路线:

    resources :users, shallow: true do
      resources :loans
    end
    
    resources :loans, only: [], shallow: true do
      resources :instalments
    end
    
    resources :instalments, only: [], shallow: true do
      resources :payments
    end
    

    $ rake routes

                    Prefix Verb   URI Pattern                                        Controller#Action
                user_loans GET    /users/:user_id/loans(.:format)                    loans#index
                           POST   /users/:user_id/loans(.:format)                    loans#create
             new_user_loan GET    /users/:user_id/loans/new(.:format)                loans#new
                 edit_loan GET    /loans/:id/edit(.:format)                          loans#edit
                      loan GET    /loans/:id(.:format)                               loans#show
                           PATCH  /loans/:id(.:format)                               loans#update
                           PUT    /loans/:id(.:format)                               loans#update
                           DELETE /loans/:id(.:format)                               loans#destroy
          loan_instalments GET    /loans/:loan_id/instalments(.:format)              instalments#index
                           POST   /loans/:loan_id/instalments(.:format)              instalments#create
       new_loan_instalment GET    /loans/:loan_id/instalments/new(.:format)          instalments#new
           edit_instalment GET    /instalments/:id/edit(.:format)                    instalments#edit
                instalment GET    /instalments/:id(.:format)                         instalments#show
                           PATCH  /instalments/:id(.:format)                         instalments#update
                           PUT    /instalments/:id(.:format)                         instalments#update
                           DELETE /instalments/:id(.:format)                         instalments#destroy
       instalment_payments GET    /instalments/:instalment_id/payments(.:format)     payments#index
                           POST   /instalments/:instalment_id/payments(.:format)     payments#create
    new_instalment_payment GET    /instalments/:instalment_id/payments/new(.:format) payments#new
              edit_payment GET    /payments/:id/edit(.:format)                       payments#edit
                   payment GET    /payments/:id(.:format)                            payments#show
                           PATCH  /payments/:id(.:format)                            payments#update
                           PUT    /payments/:id(.:format)                            payments#update
                           DELETE /payments/:id(.:format)                            payments#destroy
    

    【讨论】:

    • 我很欣赏这个回应是多么彻底,我没有选择它的唯一原因是因为出于我的目的,我不需要如此发达的东西。话虽如此,我希望这个回复能帮助其他人了解关联在 Rails 中是如何工作的!
    猜你喜欢
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2020-09-02
    • 1970-01-01
    • 2013-03-10
    相关资源
    最近更新 更多