Master Chief
2009-Feb-19 02:11 UTC
Associated child records not created on creation of a parent.
I am trying to create a record with association. Within the create method, I would also like to pre-populate dependent (has_many) records from a template in the database. The child records are <u>mysteriously rolled back </u> if I insert them in a loop. If I try to insert a single child record, it works.I have read the books and tried to google my way out of this but am at a dead end. Any help is appreciated. Problem Statement ------------ PrototypeModel has many Departments . Departments may also be grouped within Departments. Trying to create a new PrototypeModel and populating the departments (behind the scenes) from a template PrototypeModel specified by the user in params[:prototype_model][:parent_id]. The save of the PrototypeModel fails as the new Department records are invalid. I checked the instances and find that the department.id is nil. But that id is supposed to be populated by the associated save! If I replace the departments.build argument in the controller::create with a set of static arguments like :name => ''Test name'', :description=> ''Test Desc'' then it works. though only one hard code department is created :-( Just cant get my head around this. Code is below: Code : 1. class PrototypeModel < ActiveRecord::Base 2. belongs_to :author, :class_name => ''User'' 3. has_many :departments 4. belongs_to :prototype_model 5. acts_as_tree :foreign_key => "parent_id" 6. end Code : 1. class Department < ActiveRecord::Base 2. validates_presence_of :name, :description 3. validates_presence_of :parent_id 4. acts_as_tree :foreign_key => "parent_id" 5. belongs_to :department 6. belongs_to :prototype_model 7. end Code : 1. # POST /prototype_models 2. # POST /prototype_models.xml 3. def create 4. 5. @template_model = PrototypeModel.find( params [:prototype_model][:parent_id] ) 6. template_departments = @template_model.departments 7. 8. @prototype_model = PrototypeModel.new(params [:prototype_model]) 9. @prototype_model.author = current_user 10. 11. for mydepartment in template_departments 12. logger.debug "Cloning Department #{mydepartment.name}" 13. 14. newDepartment= @prototype_model.departments.build( :name => mydepartment.name, :description=> mydepartment.description, :parent_id=> mydepartment.parent_id ) 15. end 16. 17. respond_to do |format| 18. if @prototype_model.save 19. flash[:notice] = ''PrototypeModel was successfully created.'' 20. format.html { redirect_to(@prototype_model) } 21. format.xml { render :xml => @prototype_model, :status => :created, :location => @prototype_model } 22. else 23. format.html { render :action => "new" } 24. format.xml { render :xml => @prototype_model.errors, :status => :unprocessable_entity } 25. end 26. end 27. end I am using Rails 2.2.2 and Ruby 1.8.6 thanks --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Mark Reginald James
2009-Feb-19 14:39 UTC
Re: Associated child records not created on creation of a parent.
Master Chief wrote:> I am trying to create a record with association. Within the create > method, I would also like to pre-populate dependent (has_many) records > from a template in the database.I''m not exactly clear what you''re doing, but here are some comments that may help.> 1. class PrototypeModel < ActiveRecord::Base > 2. belongs_to :author, :class_name => ''User'' > 3. has_many :departments > 4. belongs_to :prototype_model > 5. acts_as_tree :foreign_key => "parent_id" > 6. end > > 1. class Department < ActiveRecord::Base > 2. validates_presence_of :name, :description > 3. validates_presence_of :parent_id > 4. acts_as_tree :foreign_key => "parent_id" > 5. belongs_to :department > 6. belongs_to :prototype_model > 7. end1. Are the two belongs_to associations that reference their own class necessary, or can you use the parent association generated by acts_as_tree? 2. You should use "validates_presence_of :parent" instead. Using the foreign key will prevent validation when the parent is new. You have to make sure that either (1), the foreign-key is non-NULL and points to an existing record, or (2), that a new parent object is assigned to the association. -- Rails Wheels - Find Plugins, List & Sell Plugins - http://railswheels.com --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Master Chief
2009-Feb-19 17:06 UTC
Re: Associated child records not created on creation of a parent.
Thank you for your response! 1. I didnt know acts_as_tree generated an association. Removed parent association from both classes. 2. Changed the validates_presence_of clause. It still gave me the same errors. :-( New Info: I also tried after removing the vpof clause altogether in departments. It removed a bunch of parent queries from the log. What remained was just a BEGIN and ROLLBACK but no error in the log. And in the flash area I still got the message that the department is invalid, so it cannot save the prototype_model. Going to add some more logging to see if I get any more info. Have been stuck here for 3 days, so really appreciate your help! regards On Feb 19, 6:39 am, Mark Reginald James <m...-bzGI/hKkdgQnC9Muvcwxkw@public.gmane.org> wrote:> Master Chief wrote: > > I am trying to create a record with association. Within the create > > method, I would also like to pre-populate dependent (has_many) records > > from a template in the database. > > I''m not exactly clear what you''re doing, but here are some > comments that may help. > > > 1. class PrototypeModel < ActiveRecord::Base > > 2. belongs_to :author, :class_name => ''User'' > > 3. has_many :departments > > 4. belongs_to :prototype_model > > 5. acts_as_tree :foreign_key => "parent_id" > > 6. end > > > 1. class Department < ActiveRecord::Base > > 2. validates_presence_of :name, :description > > 3. validates_presence_of :parent_id > > 4. acts_as_tree :foreign_key => "parent_id" > > 5. belongs_to :department > > 6. belongs_to :prototype_model > > 7. end > > 1. Are the two belongs_to associations that reference their > own class necessary, or can you use the parent association > generated by acts_as_tree? > > 2. You should use "validates_presence_of :parent" instead. > Using the foreign key will prevent validation when the > parent is new. You have to make sure that either > (1), the foreign-key is non-NULL and points to an existing > record, or (2), that a new parent object is assigned to the > association. > > -- > Rails Wheels - Find Plugins, List & Sell Plugins -http://railswheels.com--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Master Chief
2009-Feb-19 18:01 UTC
Re: Associated child records not created on creation of a parent.
Resolved! One of the data sets inserted thru SQL as a template was not passing the Validates_presence_of clauses so it was failing to insert the association. Thats why my static data was working. Also changed the validates_presence_of: parent_id to validates_presence_of: parent Also removed the self reference in the belongs_to... Thanks for the nudge in the right direction! Now I can get back on track..... :-) --- On Feb 19, 9:06 am, Master Chief <emailssa...-/E1597aS9LQAvxtiuMwx3w@public.gmane.org> wrote:> Thank you for your response! > > 1. I didnt know acts_as_tree generated an association. Removed parent > association from both classes. > 2. Changed the validates_presence_of clause. > > It still gave me the same errors. :-( > > New Info: > I also tried after removing the vpof clause altogether in > departments. It removed a bunch of parent queries from the log. What > remained was just a BEGIN and ROLLBACK but no error in the log. And > in the flash area I still got the message that the department is > invalid, so it cannot save the prototype_model. > > Going to add some more logging to see if I get any more info. > Have been stuck here for 3 days, so really appreciate your help! > > regards > > On Feb 19, 6:39 am, Mark Reginald James <m...-bzGI/hKkdgQnC9Muvcwxkw@public.gmane.org> wrote: > > > Master Chief wrote: > > > I am trying to create a record with association. Within the create > > > method, I would also like to pre-populate dependent (has_many) records > > > from a template in the database. > > > I''m not exactly clear what you''re doing, but here are some > > comments that may help. > > > > 1. class PrototypeModel < ActiveRecord::Base > > > 2. belongs_to :author, :class_name => ''User'' > > > 3. has_many :departments > > > 4. belongs_to :prototype_model > > > 5. acts_as_tree :foreign_key => "parent_id" > > > 6. end > > > > 1. class Department < ActiveRecord::Base > > > 2. validates_presence_of :name, :description > > > 3. validates_presence_of :parent_id > > > 4. acts_as_tree :foreign_key => "parent_id" > > > 5. belongs_to :department > > > 6. belongs_to :prototype_model > > > 7. end > > > 1. Are the two belongs_to associations that reference their > > own class necessary, or can you use the parent association > > generated by acts_as_tree? > > > 2. You should use "validates_presence_of :parent" instead. > > Using the foreign key will prevent validation when the > > parent is new. You have to make sure that either > > (1), the foreign-key is non-NULL and points to an existing > > record, or (2), that a new parent object is assigned to the > > association. > > > -- > > Rails Wheels - Find Plugins, List & Sell Plugins -http://railswheels.com--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---