С точки зрения ассоциации ActiveRecord любая модель с объявлением belongs_to
имеет внешний ключ, а любая модель с объявлением has_one
имеет первичный ключ.
Если мы перейдем к текущему состоянию вашей модели, то вы должны убедиться, что таблицы, такие как countries
, sates
, cities
и zip_codes
, имеют столбец с именем address_id
. Предположительно это не то, что вы хотите.
Таким образом, вы должны изменить свою Address
модель следующим образом:
class Address < ActiveRecord::Base
belongs_to :country
belongs_to :state
belongs_to :city
belongs_to :zip_code
end
Это также означает, что вы должны убедиться, что в таблице addresses
есть следующие столбцы: country_id
, state_id
, city_id
и zip_code_id
(я предполагаю, что это ваша текущая структура таблицы).
Редактировать [Я расширил свой ответ на вопросы, поднятые в разделе комментариев.]
В вашем примере вы должны использовать has_many
ассоциацию, а не has_one
ассоциацию.
class Country
has_many :addresses
end
class State
has_many :addresses
end
class City
has_many :addresses
end
class ZipCode
has_many :addresses
end
Вы можете совершать звонки, такие как:
country.addresses
state.addresses
city.addresses
zip_code.addresses
Я использовал ассоциацию has_one в следующих сценариях.
1) Пользователь с профилем
User has one Profile
Profile belongs to User
2) Торговый счет в магазине
Merchant has one Store
Store belongs to Merchant