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 Dirty Model アプローチは、私が子を作成したことを認識せず、親を保存する必要があります。

このモデルの子を作成したこと、およびモデル (およびその子) を保存する必要があることを Rails に伝えるにはどうすればよいですか?

重要な場合、問題のすべてのフォームは、実際にはcreditcard_accountにネストさfields_forれていform_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 に答える