Getting a duplicate record with has_many and update_attributes

Please help. I’ve tried all i know with no results…

I have an app with a master class using has_many to another class.
When I create a new record with the params showing all fields for
master and the has_many class it seems to work OK. But doing an edit
on the record shows two copies of the has_many class, and checking
mysql shows the two copies.

class Household < ActiveRecord::Base
has_many :people, :dependent => :destroy
has_one :visits, :dependent => :destroy

accepts_nested_attributes_for :people, :allow_destroy => true
accepts_nested_attributes_for :visits

end

class Person < ActiveRecord::Base
belongs_to :household
end

class HouseholdsController < ApplicationController

GET /households

GET /households.xml

def index
@households = Household.all

respond_to do |format|
  format.html # index.html.erb
  format.xml  { render :xml => @households }
end

end

GET /households/1

GET /households/1.xml

def show
@household = Household.find(params[:id])

respond_to do |format|
  format.html # show.html.erb
  format.xml  { render :xml => @household }
end

end

GET /households/new

GET /households/new.xml

def new
@household = Household.new
@household.people.build

respond_to do |format|
  format.html # new.html.erb
  format.xml  { render :xml => @household }
end

end

GET /households/1/edit

def edit
@today = Date.today
@household = Household.find(params[:id])
@v =
Visit.find_or_create_by_household_id_and_month_and_year(:household_id
=> params[:id], :month => @today.month, :year => @today.year)
end

POST /households

POST /households.xml

def create
@today = Date.today
@household = Household.new(params[:household])
[1,2,3,4,5,6,7,8,9,10,11,12].each do |month|
@visit =
Visit.find_or_create_by_household_id_and_month_and_year(:household_id
=> params[:id], :month => @today.month, :year => @today.year)
end

respond_to do |format|

@household.save

  if @household.update_attributes(params[:household])
    flash[:notice] = 'Household was successfully created.'
    format.html { redirect_to(@household) }
    format.xml  { render :xml => @household, :status

=> :created, :location => @household }
else
format.html { render :action => “new” }
format.xml { render :xml => @household.errors, :status
=> :unprocessable_entity }
end
end
end

PUT /households/1

PUT /households/1.xml

def update
# debugger
@today = Date.today
@household = Household.find(params[:id])
@v =
Visit.find_or_create_by_household_id_and_month_and_year(:household_id
=> params[:id], :month => @today.month, :year => @today.year)
@v.update_attributes(params[‘visit’])
respond_to do |format|
if @household.update_attributes(params[:household])
flash[:notice] = ‘Household was successfully updated.’
format.html { redirect_to(@household) }
format.xml { head :ok }
else
format.html { render :action => “edit” }
format.xml { render :xml => @household.errors, :status
=> :unprocessable_entity }
end
end
end

DELETE /households/1

DELETE /households/1.xml

def destroy
@household = Household.find(params[:id])
@household.destroy

respond_to do |format|
  format.html { redirect_to(households_url) }
  format.xml  { head :ok }
end

end
end

New household

<% form_for(@household) do |f| %>
<%= f.error_messages %>

<%= f.label :name %>
<%= f.text_field :name %>

<%= render :partial => 'people', :object => @household %>

<%= render :partial => ‘visit’, :object => @visit %>

<%= f.submit 'Create' %>

<% end %>

<%= link_to ‘Back’, households_path %>

People in household

  Sex   Birthday
<%= render :partial => 'person', :collection => @household.people %>
<%= link_to_function "Add a Person" do |page| page.insert_html :bottom, :people, :partial => 'person', :object => Person.new end %>
<% @household.build_person unless @household.people %> <% fields_for "household[people_attributes][]", person do | person_form| %> <%= person_form.text_field :sex, :size => 1, :maxlength =>1, :index => nil, :autocomplete => "off" %> <%= person_form.text_field :month, :size => 2, :maxlength =>2, :index => nil, :autocomplete => "off" %>/ <%= person_form.text_field :day, :size => 2, :maxlength =>2, :index => nil, :autocomplete => "off" %>/ <%= person_form.text_field :year, :size => 4, :maxlength =>4, :index => nil, :autocomplete => "off" %> <% unless person_form.object.new_record? %> <%= person_form.hidden_field :id, :index => nil %> <% end %> <% @person = person %> <% end %>

On 12 Apr, 05:25, Bob S. [email protected] wrote:

Please help. I’ve tried all i know with no results…

I have an app with a master class using has_many to another class.
When I create a new record with the params showing all fields for
master and the has_many class it seems to work OK. But doing an edit
on the record shows two copies of the has_many class, and checking
mysql shows the two copies.

You’re doing this in both cases

Visit.find_or_create_by_household_id_and_month_and_year(:household_id
=> params[:id], :month => @today.month, :year => @today.year)

Which will create a new visit unless there is one with all of those
same parameters. Perhaps you only wanted
find_or_create_by_household_id ?
Also if you used the association methods (ie household.visit = etc.)
then active record would take care of destroying / nulling the
previous row

Fred

I would have many records that match only the household_id that way.
One for each month and year. I’m trying to get the record for this
month. But that part works OK. The problem is with creating people
objects. It works fine after the record is created with the correct
records being changed, added or deleted. The problem is when a record
is created. The people objects added at that time are doubled. The
only reason I didn’t add visits to the models and use association
methods was that I couldn’t find a way to open the correct record that
way.

Bob

On Apr 12, 3:13 am, Frederick C. [email protected]

this line was the problem…

@household = Household.new(params[:household])

it was saving the people records because they were linked to
household, so a later

@household.update_attributes(params[:household])

doubled the record. Changing the line to

@household = Household.new()

fixed the problem… :>

Bob