Multiple foreign keys create / destroy


#1

I have 4 models :

class Country < ActiveRecord::Base
has_many :cities
has_many :streets
has_many :houses
end

class City < ActiveRecord::Base
belongs_to :country
has_many :streets
has_many :houses
end

class Street < ActiveRecord::Base
belongs_to :country
belongs_to :cities
has_many :houses
end

class House < ActiveRecord::Base
belongs_to :country
belongs_to :cities
belongs_to :streets
end

Now…if i want to create a house like this:

@street = Street.find(1)
@house = @street.houses.new
@house.name = “Burlington house”
@house.save

Now…only the street_id key is set in the house record…But not
city_id and country_id…
Is there an ORM way to let active record do the job ?

Thanks


#2

On 8 Mar 2009, at 15:11, Ruby N. wrote:

class City < ActiveRecord::Base

class House < ActiveRecord::Base
belongs_to :country
belongs_to :cities
belongs_to :streets
end

First off, watch those belongs_to - they should be singluar, ie
belongs_to :street.

city_id and country_id…
Is there an ORM way to let active record do the job ?

No. activerecord assumes the simple case ie that the has_many/
belongs_to relationship between street and house is all that it needs
(and why do you need to duplicate data between street and house ?
surely the country and city of the house is implicit from the street ?)

Fred


#3

Frederick C. wrote:

On 8 Mar 2009, at 15:11, Ruby N. wrote:

class City < ActiveRecord::Base

class House < ActiveRecord::Base
belongs_to :country
belongs_to :cities
belongs_to :streets
end

First off, watch those belongs_to - they should be singluar, ie
belongs_to :street.

city_id and country_id…
Is there an ORM way to let active record do the job ?

No. activerecord assumes the simple case ie that the has_many/
belongs_to relationship between street and house is all that it needs
(and why do you need to duplicate data between street and house ?
surely the country and city of the house is implicit from the street ?)

Fred

Your post made it clear to me… Just a beginner…:frowning:

Thanks


#4

@house.name = “Burlington house”
@house.save

Now…only the street_id key is set in the house record…But not
city_id and country_id…
Is there an ORM way to let active record do the job ?

That is the ORM way. The problem lies in your design (i.e.
associations).

A country has many cities. Cities have many streets. These streets
contain houses.
Sure a house belongs to a city, but given the additional entities
involved the above model makes more sense.

@house = some_city.streets.find(1).houses.create(:name=>‘Adelitas’)