0

私は経験豊富な Web 開発者ですが、Rails は初めてです。複式簿記データベースに基づく予算申請書を書いています。データベースにはトランザクションを表す仕訳入力が含まれており、各仕訳入力には複数の転記があります。各転記には勘定と金額があります。借方金額を負の金額として、貸方金額を正の金額として表しました。

ただし、ユーザーが正と負について覚えているとは思わないので、モデルに貸方金額と借方金額の仮想属性を作成して、貸方金額と借方金額のフィールドが別々に表示されるようにしました。

投稿モデルは次のとおりです。

class Posting < ActiveRecord::Base
  belongs_to :account
  belongs_to :journal_entry

  attr_accessible :account_id, :credit_amount, :debit_amount
  attr_accessor :credit_amount, :debit_amount

  after_validation :set_amount
  after_find :split_amount

  validates :credit_amount, :format => { :with => /\A(?:\d+(?:\.\d{1,2})?|(?:.\d{1,2}))?\z/ }
  validates :debit_amount,  :format => { :with => /\A(?:\d+(?:\.\d{1,2})?|(?:.\d{1,2}))?\z/ }

  validate :check_amounts

  def check_amounts
    unless @account_id.blank?
      if not @debit_amount.blank? and not @credit_amount.blank?
        errors.add(:base, "cannot specify both credit and debit amount.")
      elsif @debit_amount.blank? and @credit_amount.blank?
        errors.add(:base, "must specify one of credit or debit amount.")
      end
    end
  end

  protected

  def set_amount
    unless @debit_amount.blank? and @credit_amount.blank?
      self.amount = @debit_amount.blank? ? BigDecimal.new(@credit_amount) : -BigDecimal.new(@debit_amount)
    end
  end

  def split_amount
    @credit_amount = (self.amount.nil? or self.amount >= 0) ? self.amount : nil
    @debit_amount = (self.amount.nil? or self.amount >= 0) ? nil : -self.amount
  end
end

これは、1 つのモデル フィールド (金額) に対して 2 つの仮想属性 (credit_amount と debit_amount) を使用する正しい方法ですか? 基になる金額フィールドを直接使用する credit_amount/debit_amount のゲッターとセッターを作成しようとしましたが、検証エラーをユーザーに正確に報告できませんでした。

4

1 に答える 1

2

私はあなたが書いた方法が好きです。正規表現を使用した貸方金額と借方金額の検証は、これらのフィールドが数値であることを検証するよりも厳密です。金額を分割する方法では、上記のコメントを使用してそこで行っていることを説明できます。これにより、午前 3 時にデバッグする次の人がそれを理解する必要がなくなります (実際、正規表現は明示的な説明コメントも使用できます)。

これが役立つことを願っています。

幸運を!

于 2012-06-16T06:18:04.793 に答える