I need help inserting an address record to a tabled called realestates.
The relationship between these to tables is 1 to 1.
- realestates table has an address_id field set to not NULL
class Address < ActiveRecord::Base
end
class RealEstate < ActiveRecord::Base
has_one :address
end
I created two objects to match these two tables. When I let rails do the
insert of RealEstate I get an error stating that address_id is NULL.
This means that I would need to insert the address first before
inserting the RealEstate record to avoid this problem. But if Real
Estate is new record it does not have an id yet and I can't do
that. One option is to remove the constraint NOT NULL I don't want to do
that.
So the logical order would be first create an instance variable for
RealEstate and do the insert. Second, create and instance variable for
address and do the insert like below.
You appear to have a misconception about the relationship between has_one/has_many and the db schema.
First, you need to declare a belongs_to relation to the ‘owning’ class in the owned class, so you need
class Address < ActiveRecord::Base
belongs_to :real_estate
end
class RealEstate < ActiveRecord::Base
has_one :address
end
Second, the has_x associations don’t require or use a foreign key field in the table of the class which has related objects, it’s the other way around. The belongs_to association requires that the table of the class which belongs_to another has a foreign key pointing to an instance of the owning class. So with the above declarations the addresses table should have a real_estate_id field not the other way around.
If you really want to have an address_id in the real_estates table then you should instead declare that RealEstate belongs_to Address, and Address has_one RealEstate.
thanks, I did change Address to include belongs_to. But I still get the
error:
Mysql::Error: Column 'address_id' cannot be null: INSERT INTO
`real_estates`
Should I create a address object, reference the realestate from it and
save the address object which I assume would create a new real_estate
record? something like this:
thanks, I did change Address to include belongs_to. But I still get the
error:
Mysql::Error: Column ‘address_id’ cannot be null: INSERT INTO
real_estates
Go back and re-read what I posted carefully.
this is the code below:
class Address < ActiveRecord::Base
belongs_to :real_estate
This declares that the addresses table should have a column called real_estate_id.
If you have an address object and have to fetch the corresponding real_estate, then an SQL query
select * from real_estates where id = self.real_estate_id
end
class RealEstate < ActiveRecord::Base
has_one :address
This does NOT imply that the real_estates table has a column, called address_id.
If you have an instance of RealEstate and need to get the corresponding address then the SQL query will be something like:
select * from addresses limit 1 where real_estate_id = self.id
end
If you really want the id of the Address in the RealEstate you need to set up the associations so that RealEstate belongs_to Address, and Address has_one RealEstate, which is the reverse of what you have declared.
You also need to make sure that the object with the has_x attribute is saved before the one which belongs_to it. This is because the belongs to object needs the id of the owner, and there won’t be one until the owner is saved.