Validate creation of both parent and child from same form?

Alternate subject title: Validate child of unsaved parent based on
grandparent attr?

I've got a create view with a form for both the parent object as well as
multiple child objects. Upon submit, can I validate the parent and child
objects before either are saved? There are a few caveats:

1.) The validation of one attribute on all the child objects is based on
an attribute of the parent's parent! (The grandparent object is already
saved)

2.) The parent object may have an attachment that must also be valid.
(using attachment_fu)

class Project
  has_one :settlement
end

class Settlement
  belongs_to :project
  has_many :details,
    :class_name => 'SettlementDetail',
    :dependent => :delete_all do
      def total_quantity
        inject(0){|sum, p| sum + (p.quantity.nil? ? 0 : p.quantity)}
      end

      def total_weight
        inject(0){|sum, p| sum + (p.weight.nil? ? 0 : p.weight)}
      end
    end
end

class SettlementDetail < ActiveRecord::Base
  belongs_to :settlement

  validates_presence_of :quantity, :if => :quantity_required

  def quantity_required
    ### TODO Will this work on a new detail object with an unsaved
    ### parent settlement object?

    if self.settlement.project.billing_method == "Weight"
      # We don't need to validate because the billing method is Weight
      return false
    else
      # Count is required
      return true
    end
  end
end

Chris Bloom wrote:

Alternate subject title: Validate child of unsaved parent based on
grandparent attr?

I've got a create view with a form for both the parent object as well as
multiple child objects. Upon submit, can I validate the parent and child
objects before either are saved? There are a few caveats:

1.) The validation of one attribute on all the child objects is based on
an attribute of the parent's parent! (The grandparent object is already
saved)

2.) The parent object may have an attachment that must also be valid.
(using attachment_fu)

class Project
  has_one :settlement
end

class Settlement
  belongs_to :project
  has_many :details,
    :class_name => 'SettlementDetail',
    :dependent => :delete_all do
      def total_quantity
        inject(0){|sum, p| sum + (p.quantity.nil? ? 0 : p.quantity)}
      end

      def total_weight
        inject(0){|sum, p| sum + (p.weight.nil? ? 0 : p.weight)}
      end
    end
end

class SettlementDetail < ActiveRecord::Base
  belongs_to :settlement

  validates_presence_of :quantity, :if => :quantity_required

  def quantity_required
    ### TODO Will this work on a new detail object with an unsaved
    ### parent settlement object?

Yes, as long as you set the settlement association of each
settlement_detail child you build to the new settlement object,
and also set the project association of that settlement object.

Mark James wrote:

Yes, as long as you set the settlement association of each
settlement_detail child you build to the new settlement object,
and also set the project association of that settlement object.

Thanks for confirming. I'm making some changes to this particular
process so I may have more questions.