1

我已经构建了一个应用程序,可以帮助用户监控各种金融产品。

在大约 6-10 个不同的模型上,每个模型都跟踪不同类型的金融产品(信用卡、储蓄账户等),我之前有一个balance列(用于存储用户的当前余额)和一个repayments用于存储用户平均贡献的列随着时间的推移到帐户。

我现在想存储历史余额更新,我认为最好的方法是创建一个单独的balance模型,该模型可以belongs_to通过多态关系来处理所有这些模型。然后每个账户可以has_many在不同的历史点上进行余额,我可以很容易地拉出最近的用户balance

我喜欢这个解决方案,但是我有一堆自定义的用户表单,用于创建/编辑带有balance字段、repayments字段和其他一些字段的帐户,这些字段将被抽象成一个Balance模型。我不想花几个小时浏览这些表单并更改字段以适应新的嵌套结构。相反,我创建了一堆帮助方法来处理所有后端逻辑,这样我的视图就不需要以不同的方式与我的模型交互,如下所示:

#creditcard_account.rb
  has_many :balances, :as => :balanceable, :dependent => :destroy

  def latest_balance
    balances.order("created_at DESC").first
  end

  def new_balance
    @new_balance ||= balances.build
  end

  def balance=(input_balance)
    new_balance.amount = input_balance
  end

  def balance
    new_balance.balance || (latest_balance? ? self.latest_balance.amount : nil)
  end

  def repayment_amount=(input_repayment_amount)
    new_balance.contribution_amount = input_repayment_amount
  end

  def repayment_amount
    new_balance.contribution_amount || (latest_balance ?  latest_balance.contribution_amount : nil)
  end

  def repayment_period=(input_repayment_period)
    new_balance.contribution_period = input_repayment_period
  end

  def repayment_period
    new_balance.contribution_period || (latest_balance ?  latest_balance.contribution_period : nil)
  end

问题: 这很好用,除非@new_balance如果相关的实际属性没有更改,则不会保存creditcard_account。也就是说,Rails 脏模型方法不知道我已经创建了一个孩子并且需要保存父母。

我如何告诉 Rails 我已经为这个模型创建了一个子模型并且需要保存模型(以及它的子模型)?

如果它很重要,所有有问题的表单实际上都creditcard_account嵌套fields_forform_for :user.

提前致谢!

4

1 回答 1

0

我最终通过将父级的 updated_at 属性设置为 Time.now 来强制父级保存,以便父级被标记为changed?并因此被保存(及其子级):

  def balance=(input_balance)
    new_balance.amount = input_balance
    self.updated_at = Time.now
  end

  def repayment_amount=(input_repayment_amount)
    new_balance.contribution_amount = input_repayment_amount
    self.updated_at = Time.now
  end

  def repayment_period=(input_repayment_period)
    new_balance.contribution_period = input_repayment_period
    self.updated_at = Time.now
  end

对于任何尝试类似事情的人,请注意我的方法引发了其他问题:例如,对这些虚拟属性的验证几乎被破坏了。

于 2012-07-12T01:54:23.390 回答