I have two classes Person and Job defined as follows: class Person < ActiveRecord::Base :has_and_belongs_to_many jobs def add_job(job_name) job = Job.find_by_name(job_name) # See if this job exists if job.nil? # If this job doesn''t exist job = Job.new # Create a new job job.name = job_name # with the given name end jobs << job # Add to this person''s jobs end end class Job < ActiveRecord::Base :has_and_belongs_to_many people end I also have a controller that uses the add_job method in Person as follows: # ... omitted code person = Person.new person.add_job("teacher") person.save! Now, when the job with the name "teacher" already exists, the relationship between the new Person and the existing Job is not saved. If the job does not exist, it saves the new Job and creates the relationship. However, if I change the code of the add_job method as follows: def add_job(job_name) job = Job.find_by_name(job_name) # See if this job exists if job.nil? # If this job doesn''t exist job = Job.new # Create a new job job.name = job_name # with the given name jobs << job # and add to this person''s jobs else # Otherwise, if it does exist job.people << self # Add this person to the job''s people end end It saves the relationship correctly regardless of whether or not the Job already exists. My question is, why? -- Why do I need to add the person to the job''s people array to get the assocation to save when the Job already exists? -- Posted via http://www.ruby-forum.com/.
Jason Fox wrote:> # ... omitted code > person = Person.new > person.add_job("teacher") > person.save! > > Now, when the job with the name "teacher" already exists, the > relationship between the new Person and the existing Job is not saved. > If the job does not exist, it saves the new Job and creates the > relationship.In your real code Does Person have any other associations? There is a Active Record bug that causes join table entries for habtm relations on unsaved objects to not be added in some circumstances when other associations have been defined: http://www.ruby-forum.com/topic/48785 http://www.ruby-forum.com/topic/48816 Try: person = Person.create! person.add_job("teacher") person.save! -- We develop, watch us RoR, in numbers too big to ignore.
Mark Reginald James wrote:> In your real code Does Person have any other associations?Yes, Person has the following relationships: belongs_to :family has_many :kids has_and_belongs_to_many :organizations Job is also in another many-to-many relationship: has_and_belongs_to_many :companies> There is a Active Record bug that causes join table entries for > habtm relations on unsaved objects to not be added in some > circumstances when other associations have been defined: > http://www.ruby-forum.com/topic/48785 > http://www.ruby-forum.com/topic/48816 > > Try: > > person = Person.create! > person.add_job("teacher") > person.save!Thanks for the tip, I''ll read those articles and give this a shot! -- Posted via http://www.ruby-forum.com/.
Jason Fox wrote:> Yes, Person has the following relationships: > > belongs_to :family > has_many :kids > has_and_belongs_to_many :organizations > > Job is also in another many-to-many relationship: > > has_and_belongs_to_many :companiesYes, two habtms is a bug trigger. This is now aparently fixed in trunk: http://dev.rubyonrails.org/changeset/3332 -- We develop, watch us RoR, in numbers too big to ignore.