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 B. wrote:

:class_name => 'SettlementDetail',

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.

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


Rails Wheels - Find Plugins, List & Sell Plugins -
http://railswheels.com

Mark J. 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.