ct9a
2009-Sep-10 01:37 UTC
Question about using ".build" in association with has_one and belongs_to
hi, guys,
I have the following db tables:
1) Addresses - represents an address (ie line 1, line 2,
suburb,postcode, state and country)
2) Accounts - represents a user account. Will have a foreign key,
"address_id"
3) Warehouses - represents a warehouse. Will have a foreign key,
"address_id"
Each Account object can have one or zero (none) corresponding Address
object.
Each Warehouse object can have one or zero (none) corresponding
Address object.
I started off reading
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
and http://guides.rubyonrails.org/getting_started.html#associating-models
on the ".build" helper.
From what I understand in context of the latter url, the model
assigned with the "belongs_to" will have a foreign key attribute.
In my case, consider that a new Account is being created (via
registration).
The user goes to his/her profile and clicks on the "create new
Address" to fill in his/her address for the account.
The Addresses controller''s ''new'' method is called.
This is where I am stuck.
If i did something like
def new
@address = @account.address.build
end
this will cause a new Addresses object to be built with a non-existent
attribute, :user_id to be set with the new address'' id.
An option I have considered is to set the address id value into the
Account object''s foreign key, '':address_id'' when
a new address is being submitted for creation (ie. calling Addresses
controller method, ''create'').
Here''s an example:
def create
@address = Address.new(params[:address])
if @address.save
@user.id = @address.id
@user.save
flash[:notice] = "Account registered!"
redirect_back_or_default account_url
else
render :action => :new
end
end
Is there a better way to set the foreign key of an object when an
optionally associated object is being instantiated and saved to the
db?
thanks