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.