Bob Smith
2010-Apr-12 04:25 UTC
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
<h1>New household</h1>
<% form_for(@household) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :name %><br />
<%= f.text_field :name %>
</p>
<%= render :partial => ''people'', :object =>
@household %>
<%= render :partial => ''visit'', :object => @visit
%>
<p>
<%= f.submit ''Create'' %>
</p>
<% end %>
<%= link_to ''Back'', households_path %>
<h4>People in household</h4>
<b> Sex</b>
<b> Birthday</b>
<table>
<div id="people">
<%= render :partial => ''person'', :collection =>
@household.people
%>
</div>
</table>
<%= link_to_function "Add a Person" do |page|
page.insert_html :bottom, :people, :partial => ''person'',
:object =>
Person.new
end %>
<div id="person">
<% @household.build_person unless @household.people %>
<% fields_for "household[people_attributes][]", person do |
person_form| %>
<tr><td> <%= person_form.text_field :sex, :size => 1,
:maxlength
=>1, :index => nil, :autocomplete => "off" %></td>
<td><%= 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" %></td>
<td> <% unless person_form.object.new_record? %>
<%= person_form.hidden_field :id, :index => nil %>
<% end %>
</tr>
<% @person = person %>
<% end %>
</div>
--
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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.
Frederick Cheung
2010-Apr-12 08:13 UTC
Re: getting a duplicate record with has_many and update_attributes
On 12 Apr, 05:25, Bob Smith <bsm...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 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> 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| > # -eOZIpgMGZyte8C+VuNww4Q@public.gmane.org > 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 > > <h1>New household</h1> > > <% form_for(@household) do |f| %> > <%= f.error_messages %> > > <p> > <%= f.label :name %><br /> > <%= f.text_field :name %> > </p> > <%= render :partial => ''people'', :object => @household %> > > <%= render :partial => ''visit'', :object => @visit %> > <p> > <%= f.submit ''Create'' %> > </p> > <% end %> > > <%= link_to ''Back'', households_path %> > > <h4>People in household</h4> > <b> Sex</b> > <b> Birthday</b> > <table> > <div id="people"> > <%= render :partial => ''person'', :collection => @household.people > %> > </div> > </table> > <%= link_to_function "Add a Person" do |page| > page.insert_html :bottom, :people, :partial => ''person'', :object => > Person.new > end %> > > <div id="person"> > <% @household.build_person unless @household.people %> > <% fields_for "household[people_attributes][]", person do | > person_form| %> > <tr><td> <%= person_form.text_field :sex, :size => 1, :maxlength > =>1, :index => nil, :autocomplete => "off" %></td> > <td><%= 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" %></td> > <td> <% unless person_form.object.new_record? %> > <%= person_form.hidden_field :id, :index => nil %> > <% end %> > </tr> > <% @person = person %> > <% end %> > > </div>-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@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.
Bob Smith
2010-Apr-13 04:15 UTC
Re: getting a duplicate record with has_many and update_attributes
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 Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On 12 Apr, 05:25, Bob Smith <bsm...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 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 > > > 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| > > # -eOZIpgMGZyte8C+VuNww4Q@public.gmane.org > > 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 > > > <h1>New household</h1> > > > <% form_for(@household) do |f| %> > > <%= f.error_messages %> > > > <p> > > <%= f.label :name %><br /> > > <%= f.text_field :name %> > > </p> > > <%= render :partial => ''people'', :object => @household %> > > > <%= render :partial => ''visit'', :object => @visit %> > > <p> > > <%= f.submit ''Create'' %> > > </p> > > <% end %> > > > <%= link_to ''Back'', households_path %> > > > <h4>People in household</h4> > > <b> Sex</b> > > <b> Birthday</b> > > <table> > > <div id="people"> > > <%= render :partial => ''person'', :collection => @household.people > > %> > > </div> > > </table> > > <%= link_to_function "Add a Person" do |page| > > page.insert_html :bottom, :people, :partial => ''person'', :object => > > Person.new > > end %> > > > <div id="person"> > > <% @household.build_person unless @household.people %> > > <% fields_for "household[people_attributes][]", person do | > > person_form| %> > > <tr><td> <%= person_form.text_field :sex, :size => 1, :maxlength > > =>1, :index => nil, :autocomplete => "off" %></td> > > <td><%= 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" %></td> > > <td> <% unless person_form.object.new_record? %> > > <%= person_form.hidden_field :id, :index => nil %> > > <% end %> > > </tr> > > <% @person = person %> > > <% end %> > > > </div>-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@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.
Bob Smith
2010-Apr-18 05:37 UTC
Re: getting a duplicate record with has_many and update_attributes
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 On Apr 13, 12:15 am, Bob Smith <bsm...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> 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 Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> > wrote: > > > On 12 Apr, 05:25, Bob Smith <bsm...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 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 > > > > 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| > > > # -eOZIpgMGZyte8C+VuNww4Q@public.gmane.org > > > 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 > > > > <h1>New household</h1> > > > > <% form_for(@household) do |f| %> > > > <%= f.error_messages %> > > > > <p> > > > <%= f.label :name %><br /> > > > <%= f.text_field :name %> > > > </p> > > > <%= render :partial => ''people'', :object => @household %> > > > > <%= render :partial => ''visit'', :object => @visit %> > > > <p> > > > <%= f.submit ''Create'' %> > > > </p> > > > <% end %> > > > > <%= link_to ''Back'', households_path %> > > > > <h4>People in household</h4> > > > <b> Sex</b> > > > <b> Birthday</b> > > > <table> > > > <div id="people"> > > > <%= render :partial => ''person'', :collection => @household.people > > > %> > > > </div> > > > </table> > > > <%= link_to_function "Add a Person" do |page| > > > page.insert_html :bottom, :people, :partial => ''person'', :object => > > > Person.new > > > end %> > > > > <div id="person"> > > > <% @household.build_person unless @household.people %> > > > <% fields_for "household[people_attributes][]", person do | > > > person_form| %> > > > <tr><td> <%= person_form.text_field :sex, :size => 1, :maxlength > > > =>1, :index => nil, :autocomplete => "off" %></td> > > > <td><%= 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" %></td> > > > <td> <% unless person_form.object.new_record? %> > > > <%= person_form.hidden_field :id, :index => nil %> > > > <% end %> > > > </tr> > > > <% @person = person %> > > > <% end %> > > > > </div> > >-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@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.