1

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 モデルのステータスを更新したい。

たとえば、セクション テーブルの「ステータス」列は、段落テーブルの「テキスト」列に依存しています。同様に、ドキュメント テーブルの「ステータス」列は、セクション テーブルの「ステータス」列に依存します。

簡単に言うと、セクションについては、

  1. 段落テーブルのすべての「テキスト」が nil の場合、対応するセクションの「ステータス」を「新規」に変更する必要があります。
  2. 段落テーブルのいずれかの「テキスト」列に値がある場合、セクションの「ステータス」を「処理中」に変更する必要があります。
  3. それ以外の場合、ステータスは「完了」です。

ドキュメントの場合、

  1. セクション テーブルのすべての「ステータス」が「新規」の場合、対応するドキュメントの「ステータス」を「新規」に変更する必要があります。
  2. いずれかの「ステータス」が「処理中」の場合、ドキュメントの「ステータス」を「処理中」に変更する必要があります。
  3. それ以外は「完了」です。

問題:

assign_order_status メソッドに適したコールバックを混乱させています。

Document の「ステータス」は Section のステータスに依存し、Section のステータスは Paragraph の値に依存するためです。ただし、Rails の検証とコールバックは親から子へと実行されます。私の場合、「ステータス」値の計算は子から親に基づいています。

検証を開始する前にドキュメントとセクションの両方のステータス値を更新する方法は?

誰でもこれを解決するのを手伝ってください。

4

0 に答える 0