can someone help me with this
i have a table
cars
(
id int
model_id int
make_id int
color_id int
description text
constraint fk_cars_carmake foreign key(make_id) references
carmakes(id),
constraint fk_cars_carmodel foreign key(model_id) references
carmodels(id),
constraint fk_cars_color foreign key(color_id) references colors(id)
)
carmakes
(
id int
carmake varchar
)
carmodels
(
id int
carmake_id int
carmodel varchar
)
colors
(
id int
color varchar
)
Carmakes and Carmodels
- A carmake may be Toyota, Honda etc.
- A carmodel may be Corrola, Civic.
- Each carmodel will have a id of its parent.
- So for instance
if in the carmake table i have
1 Toyota
2 Honda
then in the carmodel table ill have
1 1 Corolla
1 2 Civic
(hope this helps you understand)
the color table is simply
id = 1, color = red
id = 2, color = blue ...etc.
Now i want to be able to Create a form to Add Cars
The form would have all the info pertaing to cars, along with dropdown
lists for the makes, models, colors...
i get this error when i do it
Mysql::Error: #23000Cannot add or update a child row: a foreign key
constraint fails: INSERT INTO cars (`created_on`, `number_plate`,
`price`, `title`, `updated_on`, `color_id`, `make_id`, `cc_rating`,
`description`, `negotiable`, `views`, `year`, `transmission`, `user_id`,
`car_type`, `mileage`, `model_id`) VALUES('''',
''PBO-5678'', 36000.0, ''2001
Corolla'', ''2006-03-22 02:23:35'', 0, 0, 1800,
''Nice\n'', 0, 0, 2001,
''Manual'', 1, ''\'''', 1600, 0)
also
Request
Parameters: {"commit"=>"Create",
"carmake"=>{"id"=>"1"},
"color"=>{"id"=>"4"},
"car"=>{"number_plate"=>"PBO-5678",
"title"=>"2001
Corolla", "price"=>"36000",
"cc_rating"=>"1800",
"description"=>"Nice\n",
"negotiable"=>"0", "year"=>"2001",
"views"=>"0",
"transmission"=>"Manual",
"mileage"=>"1600"},
"carmodel"=>{"id"=>"1"}}
now i think for some reason it is trying to save the other tables as
well...not just the cars...
anyhow i''ve been trying to get this to work for the past few nights
with
no luck..can someone help me please
here are the controller/views.
#Controller
----------------------------------------------------------------
class AdminController < ApplicationController
def index
end
def return_to_main
# If you have multiple scaffolds on the same view then you will want
to change this to
# to whatever controller/action shows all the views
# (ex: redirect_to :controller => ''AdminConsole'',
:action =>
''index'')
redirect_to :action => ''index''
end
def list
@cars = Car.find :all
render :layout => false
end
def new
@car = Car.new
if request.xhr?
@temp_id = Time.new.to_i
@headers[''car-id''] = @temp_id
@headers[''Content-Type''] = ''text/html;
charset=utf-8''
render :layout => false
# If you want to send an error message:
# render :inline => "Error text goes here", :layout =>
false,
:status => 500
end
end
def create
@car = Car.new(params[:car])
@car.user_id = session[''user''].id
@car.make_id = session[''carmake''].id
@car.model_id = session[''carmodel''].id
@car.color_id = session[''color''].id
if @car.save
if request.xhr?
@headers[''car-id''] = @car.id
@headers[''Content-Type''] = ''text/html;
charset=utf-8''
render :partial => ''car'', :layout => false,
:locals => { :hidden
=> true }
else
return_to_main
end
else
render :partial => ''form_errors'', :layout =>
false, :status => 500
if request.xhr?
render :action => ''new'' if not request.xhr?
end
end
def edit
@car = Car.find(params[:id])
@car.user_id = session[''user''].id
render :layout => false if request.xhr?
end
def update
@car = Car.find(params[:id])
@car.user_id = session[''user''].id
if @car.update_attributes(params[:car])
render :partial => ''car'', :layout => false,
:locals => { :hidden
=> true } if request.xhr?
return_to_main if not request.xhr?
else
render :partial => ''form_errors'', :layout =>
false, :status => 500
if request.xhr?
render :action => ''edit'' if not request.xhr?
end
end
def destroy
Car.find(params[:id]).destroy
render :nothing => true if request.xhr?
return_to_main if not request.xhr?
end
end
#View
--------------------------------------------------------------------
<fieldset>
<div class="row">
<!--[form:car]-->
<div class="form-element">
<label for="car_title">Title</label>
<%= text_field ''car'', ''title'' %>
</div>
<div class="form-element">
<label for="car_make">Make</label>
<% @carmakes = Carmake.find(:all, :order => "carmake")
collection_select(:carmake, :id, @carmakes, :id, :carmake)
%>
</div>
<div class="form-element">
<label for="car_model">Model</label>
<% @carmodels = Carmodel.find(:all, :order => "carmodel")
collection_select(:carmodel, :id, @carmodels, :id, :carmodel)
%>
</div>
<div class="form-element">
<label for="car_year">Year</label>
<%= text_field ''car'', ''year'' %>
</div>
<div class="form-element">
<label for="car_number_plate">Number plate</label>
<%= text_field ''car'', ''number_plate''
%>
</div>
<div class="form-element">
<label for="car_color">Color</label>
<% @colors = Color.find(:all, :order => "color")
collection_select(:color, :id, @colors, :id, :color)
%>
</div>
<div class="form-element">
<label for="car_cc_rating">Cc rating</label>
<%= text_field ''car'', ''cc_rating''
%>
</div>
<div class="form-element">
<label for="car_transmission">Transmission</label>
<%= text_field ''car'', ''transmission''
%>
</div>
<div class="form-element">
<label for="car_mileage">Mileage</label>
<%= text_field ''car'', ''mileage'' %>
</div>
<div class="form-element">
<label for="car_price">Price</label>
<%= text_field ''car'', ''price'' %>
</div>
<div class="form-element">
<label for="car_negotiable">Negotiable</label>
<%= text_field ''car'', ''negotiable''
%>
</div>
<div class="form-element">
<label for="car_description">Description</label>
<%= text_area ''car'', ''description''
%>
</div>
<div class="form-element">
<label for="car_created_on">Created on</label>
</div>
<div class="form-element">
<label for="car_updated_on">Updated on</label>
</div>
<div class="form-element">
<label for="car_views">Views</label>
<%= text_field ''car'', ''views'' %>
</div>
<!--[eoform:car]-->
</div>
</fieldset>
#--------------------------------------------------------------------------
by the way, you may ignore the user_id, i''m using SHGL and it stores
the
user_id fine when i tested creations before the car table had all the
other references.
Thanks to whomsover can help me.
--
Posted via http://www.ruby-forum.com/.
Ray Dookie wrote:> can someone help me with this > > i have a table > cars > ( > id int > model_id int > make_id int > color_id int > description text > constraint fk_cars_carmake foreign key(make_id) references > carmakes(id), > constraint fk_cars_carmodel foreign key(model_id) references > carmodels(id), > constraint fk_cars_color foreign key(color_id) references colors(id) > ) > > carmakes > ( > id int > carmake varchar > ) > > carmodels > ( > id int > carmake_id int > carmodel varchar > ) > > colors > ( > id int > color varchar > ) > > Carmakes and Carmodels > - A carmake may be Toyota, Honda etc. > - A carmodel may be Corrola, Civic. > - Each carmodel will have a id of its parent. > - So for instance > if in the carmake table i have > 1 Toyota > 2 Honda > > then in the carmodel table ill have > 1 1 Corolla > 1 2 Civic > (hope this helps you understand) > > the color table is simply > id = 1, color = red > id = 2, color = blue ...etc. > > Now i want to be able to Create a form to Add Cars > The form would have all the info pertaing to cars, along with dropdown > lists for the makes, models, colors... > > i get this error when i do it > Mysql::Error: #23000Cannot add or update a child row: a foreign key > constraint fails: INSERT INTO cars (`created_on`, `number_plate`, > `price`, `title`, `updated_on`, `color_id`, `make_id`, `cc_rating`, > `description`, `negotiable`, `views`, `year`, `transmission`, `user_id`, > `car_type`, `mileage`, `model_id`) VALUES('''', ''PBO-5678'', 36000.0, ''2001 > Corolla'', ''2006-03-22 02:23:35'', 0, 0, 1800, ''Nice\n'', 0, 0, 2001, > ''Manual'', 1, ''\'''', 1600, 0) >This ''insert'' doesn''t match the above table definition! You need to find out what ?_id field isn''t in your database. Do you have :- colors.id = 0 makes.id = 0 models.id = 0> also > Request > > Parameters: {"commit"=>"Create", "carmake"=>{"id"=>"1"}, > "color"=>{"id"=>"4"}, "car"=>{"number_plate"=>"PBO-5678", "title"=>"2001 > Corolla", "price"=>"36000", "cc_rating"=>"1800", > "description"=>"Nice\n", "negotiable"=>"0", "year"=>"2001", > "views"=>"0", "transmission"=>"Manual", "mileage"=>"1600"}, > "carmodel"=>{"id"=>"1"}} > > now i think for some reason it is trying to save the other tables as > well...not just the cars... > anyhow i''ve been trying to get this to work for the past few nights with > no luck..can someone help me please > here are the controller/views. > > #Controller > ---------------------------------------------------------------- > class AdminController < ApplicationController > > def index > > end > > > def return_to_main > # If you have multiple scaffolds on the same view then you will want > to change this to > # to whatever controller/action shows all the views > # (ex: redirect_to :controller => ''AdminConsole'', :action => > ''index'') > redirect_to :action => ''index'' > end > > def list > @cars = Car.find :all > render :layout => false > end > > def new > @car = Car.new > > if request.xhr? > @temp_id = Time.new.to_i > @headers[''car-id''] = @temp_id > @headers[''Content-Type''] = ''text/html; charset=utf-8'' > > render :layout => false > > # If you want to send an error message: > # render :inline => "Error text goes here", :layout => false, > :status => 500 > end > end > > def create > @car = Car.new(params[:car]) > @car.user_id = session[''user''].id > @car.make_id = session[''carmake''].id > @car.model_id = session[''carmodel''].id > @car.color_id = session[''color''].id > > if @car.save > if request.xhr? > @headers[''car-id''] = @car.id > @headers[''Content-Type''] = ''text/html; charset=utf-8'' > render :partial => ''car'', :layout => false, :locals => { :hidden > => true } > else > return_to_main > end > else > render :partial => ''form_errors'', :layout => false, :status => 500 > if request.xhr? > render :action => ''new'' if not request.xhr? > end > end > > def edit > @car = Car.find(params[:id]) > @car.user_id = session[''user''].id > > render :layout => false if request.xhr? > end > > def update > @car = Car.find(params[:id]) > @car.user_id = session[''user''].id > > if @car.update_attributes(params[:car]) > render :partial => ''car'', :layout => false, :locals => { :hidden > => true } if request.xhr? > return_to_main if not request.xhr? > else > render :partial => ''form_errors'', :layout => false, :status => 500 > if request.xhr? > render :action => ''edit'' if not request.xhr? > end > end > > def destroy > Car.find(params[:id]).destroy > render :nothing => true if request.xhr? > return_to_main if not request.xhr? > end > end > > #View > -------------------------------------------------------------------- > <fieldset> > <div class="row"> > <!--[form:car]--> > <div class="form-element"> > <label for="car_title">Title</label> > <%= text_field ''car'', ''title'' %> > </div> > > <div class="form-element"> > <label for="car_make">Make</label> > <%> @carmakes = Carmake.find(:all, :order => "carmake") > collection_select(:carmake, :id, @carmakes, :id, :carmake) > %> > </div> > > <div class="form-element"> > <label for="car_model">Model</label> > <%> @carmodels = Carmodel.find(:all, :order => "carmodel") > collection_select(:carmodel, :id, @carmodels, :id, :carmodel) > %> > </div> > > <div class="form-element"> > <label for="car_year">Year</label> > <%= text_field ''car'', ''year'' %> > </div> > > <div class="form-element"> > <label for="car_number_plate">Number plate</label> > <%= text_field ''car'', ''number_plate'' %> > </div> > > <div class="form-element"> > <label for="car_color">Color</label> > <%> @colors = Color.find(:all, :order => "color") > collection_select(:color, :id, @colors, :id, :color) > %> > </div> > > <div class="form-element"> > <label for="car_cc_rating">Cc rating</label> > <%= text_field ''car'', ''cc_rating'' %> > </div> > > <div class="form-element"> > <label for="car_transmission">Transmission</label> > <%= text_field ''car'', ''transmission'' %> > </div> > > <div class="form-element"> > <label for="car_mileage">Mileage</label> > <%= text_field ''car'', ''mileage'' %> > </div> > > <div class="form-element"> > <label for="car_price">Price</label> > <%= text_field ''car'', ''price'' %> > </div> > > <div class="form-element"> > <label for="car_negotiable">Negotiable</label> > <%= text_field ''car'', ''negotiable'' %> > </div> > > <div class="form-element"> > <label for="car_description">Description</label> > <%= text_area ''car'', ''description'' %> > </div> > > <div class="form-element"> > <label for="car_created_on">Created on</label> > > </div> > > <div class="form-element"> > <label for="car_updated_on">Updated on</label> > > </div> > > <div class="form-element"> > <label for="car_views">Views</label> > <%= text_field ''car'', ''views'' %> > </div> > > <!--[eoform:car]--> > > </div> > </fieldset> > #-------------------------------------------------------------------------- > > by the way, you may ignore the user_id, i''m using SHGL and it stores the > user_id fine when i tested creations before the car table had all the > other references. > > Thanks to whomsover can help me. >
Ray Dookie wrote:> by the way, you may ignore the user_id, i''m using SHGL and it stores the > user_id fine when i tested creations before the car table had all the > other references. > > Thanks to whomsover can help me.Can you pop your models in here too? When you assign the car make to the new car instance you should let rails take care of the relationships so in your model you should have; class carmake < ActiveRecord::Base has_many :cars end and in; class car < ActiveRecord::Base belongs_to: carmake end then when you add the make to the car; @make = Carmake.find(session[:carmake]) @make.cars << @car @car.save obviously a little cleaner that that & the :id needs passing in :carmake, but that should do it. When you save the car rails will take care of the foreign keys for you. -- Posted via http://www.ruby-forum.com/.
Hrm.. tried and still didnt not work. ok lets try something simpler if i have tables ------------------------------ car ( id int name varchar color_id int constraint fk_cars_color foreign key (color_id) references colors(id) ) and I have a table color( id int color_name varchar ) ------------------------------ I want a form to create cars..so on the form i would have atext-field for "name" and a dropdown list for "color" how would the controller (create method), model and view look so i could just select the color from the dropdown list enter the name and create the car?? Thanks -- Posted via http://www.ruby-forum.com/.