Document、Section、Paragraphの3つのモデルがあります。
class Document < ActiveRecord::Base
attr_accessible :status
has_many :sections
accepts_nested_attributes_for :sections, :allow_destroy => :true
private
def assign_order_status
section_statuses = sections.map(&:status)
self.status =
if section_statuses.all? {|value| value == "completed" }
"completed"
elsif section_statuses.all? {|value| value == "new" }
"new"
else
"inprocess"
end
end
end
class Section < ActiveRecord::Base
attr_accessible :document_id, :status
belongs_to :document
has_many :paragraphs, :dependent => :destroy
accepts_nested_attributes_for :paragraphs, :allow_destroy => :true
private
def assign_order_status
paragraph_values = paragraphs.map(&:text)
self.status =
if paragraph_values.all? {|value| !value.nil? }
"completed"
elsif paragraph_values.any? {|value| !value.nil? }
"inprocess"
else
"new"
end
end
end
class Paragraph < ActiveRecord::Base
attr_accessible :section_id, :text
belongs_to :section
end
Document モデルと Section モデルのステータスを更新したい。
たとえば、セクション テーブルの「ステータス」列は、段落テーブルの「テキスト」列に依存しています。同様に、ドキュメント テーブルの「ステータス」列は、セクション テーブルの「ステータス」列に依存します。
簡単に言うと、セクションについては、
- 段落テーブルのすべての「テキスト」が nil の場合、対応するセクションの「ステータス」を「新規」に変更する必要があります。
- 段落テーブルのいずれかの「テキスト」列に値がある場合、セクションの「ステータス」を「処理中」に変更する必要があります。
- それ以外の場合、ステータスは「完了」です。
ドキュメントの場合、
- セクション テーブルのすべての「ステータス」が「新規」の場合、対応するドキュメントの「ステータス」を「新規」に変更する必要があります。
- いずれかの「ステータス」が「処理中」の場合、ドキュメントの「ステータス」を「処理中」に変更する必要があります。
- それ以外は「完了」です。
問題:
assign_order_status メソッドに適したコールバックを混乱させています。
Document の「ステータス」は Section のステータスに依存し、Section のステータスは Paragraph の値に依存するためです。ただし、Rails の検証とコールバックは親から子へと実行されます。私の場合、「ステータス」値の計算は子から親に基づいています。
検証を開始する前にドキュメントとセクションの両方のステータス値を更新する方法は?
誰でもこれを解決するのを手伝ってください。