One-to-One relationships with Rails
This is a lot easier than I thought it would be and it actually took me longer than it should have because I was trying to do it manually.
First you need to define the relationship on the parent and children models:
<br /> class Person < ActiveRecord::Base<br /> has_one :person_details, :dependent=>true<br /> end</p> <p>class PersonDetails < ActiveRecord::Base<br /> belongs_to :person<br /> end</p> <p>
Note that this automatically will provide with a person_details member for person when it gets retrieved.
Now on the controller, here's the CRUD:
<br /> def create<br /> @person = Person.new(params[:person])<br /> @person_details = PersonDetails.new(params[:person_details])<br /> @person.person_details = @person_details<br /> if @person.save<br /> # Cool, you're done! It saves the person_details as well.<br /> end<br /> end</p> <p> def edit<br /> @person = Person.find(params[:id])<br /> @person_details = @person.person_details<br /> end</p> <p>def update<br /> @person = Person.find(params[:id])<br /> if @person.update_attributes(params[:person]) and<br /> @person.person_details.update_attributes(params[:person_details])<br /> # Cool, you're done!<br /> end<br /> end</p> <p>def destroy<br /> Person.find(params[:id]).destroy<br /> end<br />
Now your rhtml _form.rhtml must have things like:
<br /> text_field 'person_details', column.name<br /> text_field 'person, column.name<br />
And you will get two sets of parameters (as you can see in your controller code), params[:person], and params[:person_details]. Your instance variables to set the current values on the view side would be @person and @person_details.
And I was sitting there writing custom code to find/save.. Ugh!

On edit if you want to save 2 database calls you can put
@person = Person.find(params[:id], :include =>:person_details)