我有三个模型,文档,部分和段落。
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”列。同样,文档表中的“状态”列取决于部分表中的“状态”列。
简而言之,对于部分,
- 如果段落表中的所有“文本”都为零,则相应部分的“状态”必须更改为“新”。
- 如果段落表中的任何一个“文本”列具有值,则部分的“状态”必须更改为“处理中”。
- 否则状态为“完成”。
对于文件,
- 如果节表中的所有“状态”都是“新”,则相应文档的“状态”必须更改为“新”。
- 如果任何一个“状态”是“处理中”,那么文档的“状态”必须更改为“处理中”。
- 否则为“完成”。
问题:
我很困惑哪些回调适合 assign_order_status 方法。
因为文档的“状态”取决于部分的状态,而部分的状态取决于段落的值。但是 Rails 验证和回调是从父级运行到子级的。就我而言,“状态”值的计算是基于从孩子到父母的。
如何在开始验证之前更新文档和部分的状态值?
请任何人帮我解决这个问题。