rails 3 - 如何使用回调将值赋给嵌套属性

时间:2013-06-04 16:27:48

标签: ruby-on-rails-3 activerecord callback

我有三个模型,Document,Section和Paragraph。

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'列取决于段落表中的'text'列。 simillarly,文档表中的'status'列取决于sections表中的'status'列。

简而言之,对于部分,

  1. 如果段落表格中的所有'text'都是nil,则相应部分的'status'必须更改为“new”。
  2. 如果段落表格中的任何一个'text'列具有值,则该部分的'status'必须更改为“inprocess”。
  3. 否则状态为“已完成”。
  4. for document,

    1. 如果部分表中的所有'状态'都是“新”,那么同名文档的'状态'必须更改为“新”。
    2. 如果任何一个'status'是“inprocess”,那么文档的'status'必须更改为“inprocess”。
    3. 否则为“已完成”。
    4. 问题:

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

      因为Document的'status'取决于Section的状态而Section的状态取决于Paragraph的值。 但Rails验证和回调正在从父级到子级运行。在我的例子中,'status'值的计算基于从子到父。

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

      请有人帮我解决这个问题。

0 个答案:

没有答案