0

私は経験豊富なWeb開発者ですが、Railsは初めてです。私は複式簿記データベースに基づいた予算申請書を書いています。データベースにはトランザクションを表すジャーナルエントリが含まれており、各ジャーナルエントリには複数の投稿があります。各投稿にはアカウントと金額があります。

これが私のモデルの簡略化されたバージョンです:

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

  attr_accessible :account_id, :amount
end

class JournalEntry < ActiveRecord::Base
  has_many :postings, :dependent => :destroy

  attr_accessible :narrative, :posting_date, :postings_attributes

  accepts_nested_attributes_for :postings, :allow_destroy => :true,
    :reject_if => proc { |attrs| attrs.all? { |k, v| k == '_destroy' or v.blank? } } 
end

ジャーナルエントリとその投稿リストを一緒に編集できるネストされたフォームを正常に作成しました。ただし、ほとんどの仕訳入力は単純で、1つの貸方記入項目と1つの借方記入項目があります。この場合のデータ入力を簡単にするために、ユーザーがクレジットアカウント、デビットアカウント、および金額を指定するだけの別のフォームが必要です。

私の研究から、これを行うための2つの方法を見ることができます。

  1. SimpleJournalEntry(JournalEntryを拡張する)の単一テーブル継承
  2. ActiveModelを使用して、データベースに直接接続されていないSimpleJournalEntryモデルを作成し、コントローラーでデータベースの変更を自分で処理します

SimpleJournalEntryモデルには、クレジットアカウント、デビットアカウント、および金額があり、単純なレコードの編集に使用されます。より複雑なレコードの編集を可能にするために、既存のJournalEntryモデルは引き続き存在します。

この種のことを処理するための「レールの方法」はどれですか?私が考慮していない別のオプションはありますか?

4

2 に答える 2

2

私はこれを処理するためにSTIを使用しません。基本的に、単純な「ビュー」と「複雑な」ビューがあり、基になるモデルは変更されず、表示したいビューだけが変更されます。

この単純なビューへの代替リンク(パス/ルート)を作成し、コントローラーの保存アクションで「単純さ」を管理することに問題はありません。受信したパラメーターを調べて、実行するアクションを決定するだけです。

さらに良いことに、受け取ったパラメータをジャーナルエントリモデルに渡し、単純または複雑な保存の詳細を処理できるようにします。結局のところ、会計に関連するビジネスルールはモデルに含まれている必要がありますが、そうではありませんか?

于 2012-06-18T04:32:18.973 に答える
2

私はこれについてrailsdogに反対しなければなりません。私はあなたが良いSTI候補を持っていると思います。特に、「[JournalEntry]に単純または複雑な保存の詳細を処理させる」ということは、2つの別々の関心事に対処していることを示していると思います。

単純なJournalEntriesと複雑なJournalEntriesのビジネスロジックが異なる場合は、2つの異なるクラスで表す必要があります。たとえば、複雑なJournalEntryが、単純なJournalEntryにはない検証を追加したい場合があることを想像するのは難しいことではありません。または、単純なJournalEntryには、複雑なJournalEntryよりもattr_accessible宣言が少ないはずです。私は提案します:

class JournalEntry < ActiveRecord::Base
  # shared accessors and validations
end

class SimpleJournalEntry < JournalEntry
  # simple accessors and validations 
end

class ComplexJournalEntry < JournalEntry
  # more complex accessors and validations
end

これらの2つのクラスは、別々のコントローラーとビューで処理します。

無関係なことに、#accepts_nested_attributes_forの:all_blankオプションは、Procが行うことを実行する必要があります。ドキュメントから:「Procの代わりに:all_blankを渡すと、_destroyの値を除いてすべての属性が空白であるレコードを拒否するprocが作成されます。」あれは、accepts_nested_attributes_for :postings, :reject_if => :all_blank

于 2012-06-18T05:36:25.490 に答える