1

我有三个模型,文档,部分和段落。

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 模型的状态。

例如,sections 表中的“status”列取决于paragraphs 表中的“text”列。同样,文档表中的“状态”列取决于部分表中的“状态”列。

简而言之,对于部分,

  1. 如果段落表中的所有“文本”都为零,则相应部分的“状态”必须更改为“新”。
  2. 如果段落表中的任何一个“文本”列具有值,则部分的“状态”必须更改为“处理中”。
  3. 否则状态为“完成”。

对于文件,

  1. 如果节表中的所有“状态”都是“新”,则相应文档的“状态”必须更改为“新”。
  2. 如果任何一个“状态”是“处理中”,那么文档的“状态”必须更改为“处理中”。
  3. 否则为“完成”。

问题:

我很困惑哪些回调适合 assign_order_status 方法。

因为文档的“状态”取决于部分的状态,而部分的状态取决于段落的值。但是 Rails 验证和回调是从父级运行到子级的。就我而言,“状态”值的计算是基于从孩子到父母的。

如何在开始验证之前更新文档和部分的状态值?

请任何人帮我解决这个问题。

4

0 回答 0