私は経験豊富な 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 のゲッターとセッターを作成しようとしましたが、検証エラーをユーザーに正確に報告できませんでした。