Ruby on Rails: отображение один-к-одному. Просто семантика или действительно другая структура - PullRequest
2 голосов
/ 14 марта 2010

Таким образом, я создаю плагин для Ruby on Rails, чтобы сделать реализованные адреса, включая страну, штат, город и zip_code, для стран, которые могут намного проще следовать этой парадигме, но это не так, как ожидается, для того, как ассоциируется модель адреса .

Итак, начнем с моей модели адреса.

class Address < ActiveRecord::Base
    has_one :country
    has_one :state
    has_one :city
    has_one :zip_code
end

В чем разница между словами belongs_to и has_one

Кажется, что это одно и то же, потому что обеим требуется только одна модель для объявления о праве собственности, а Foreign_key

И, кажется, логично сказать и то и другое.

адрес принадлежит учетной записи, а учетная запись имеет один адрес

Это только семантика или есть реальная разница

1 Ответ

4 голосов
/ 14 марта 2010

С точки зрения ассоциации 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...