Путаница в таблицах для has_one и has_many - PullRequest
1 голос
/ 17 октября 2010

В руководстве Rails Ассоциации ActiveRecord я запутался, почему таблицы для has_one и has_many идентичны:

Примеры таблиц для has_many:

customers(id,name)
orders(id,customer_id,order_date)

Примеры таблиц для has_one: эти таблицы на уровне базы данных также позволят поставщику иметь много учетных записей, но нам просто нужна одна учетная запись на каждого поставщика

suppliers(id,name)
accounts(id,supplier_id,account_number) #Foreign Key to supplier here??

Не должны ли таблицы для has_one быть такими:

suppliers(id,name,account_id) #Foreign Key to account here
accounts(id,account_number)

Теперь, поскольку account_id находится в таблице поставщиков, поставщик никогда не может иметь более одной учетной записи.

Неправильно ли приведен пример в Руководстве по Rails?

Или Rails использует подход has_many, но ограничивает выполнение части many?

Ответы [ 3 ]

2 голосов
/ 17 октября 2010

Я считаю, что это связано с ограничениями. С помощью has_one rails будет пытаться обеспечить наличие только одной учетной записи на одного поставщика. Однако при has_many ограничения не будут применяться, поэтому поставщику с has_many будет разрешено существовать с несколькими учетными записями.

Нужно привыкнуть к размышлениям об отношениях и их создании в рельсах. Если вы хотите применить внешние ключи на стороне базы данных (поскольку rails не делает этого вне прикладного уровня), взгляните на иностранец Мэтью Хиггинса

2 голосов
/ 17 октября 2010

Если подумать об этом - они все одинаковы:

1 клиент может иметь много заказов, поэтому каждая запись заказа указывает на клиента.

1 поставщик может иметь одинучетная запись, и это особый случай «имеет много», поэтому он в равной степени работает с учетной записью, указывающей назад на поставщика.

, и это то же самое, что и со многими ко многим, с соединительной таблицей, указывающей назад наотдельные записи ... (если учащийся может посещать много классов, а в одном классе может быть много учащихся, то таблица регистрации указывает на записи учащихся и класса).

, почему учетная запись указывает напоставщик против учетной записи указывает поставщику, что я не совсем уверен, можем ли мы получить ее в любом случае, или одна форма лучше другой.

1 голос
/ 17 октября 2010

Если я правильно понимаю ваш вопрос, вы считаете, что отношение 1: 1 двунаправлено в отношении has_one / own_to.Это не совсем так.Вы могли бы иметь:

Class Account
  belongs_to :supplier
  belongs_to :wholesaler
  belongs_to :shipper
  # ...
end

account = supplier.account       # Get supplier's account
wholesaler = Wholesaler.new
wholesaler.accounts << account   # Tell wholesaler this is one of their suppliers
wholesaler.save

Я не говорю, что ваше приложение действительно ведет себя таким образом, но вы можете видеть, как таблица - нет, скажем, модель - которая "принадлежит" другой моделине исключается принадлежность к любому количеству моделей.Правильно?Таким образом, отношения на самом деле бесконечны: 1.

Я должен добавить, что has_one - это действительно вырожденный случай has_many и просто добавляет синтаксический сахар для придания сингулярности ассоциации и нескольким другим нитам.В остальном это почти одно и то же, и именно поэтому они выглядят одинаково.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...