В чем разница между а belongs_to
и а has_one
?
Чтение руководства по Ruby on Rails мне не помогло.
ruby-on-rails
activerecord
Бланкмэн
источник
источник
Ответы:
По сути, они делают то же самое, единственная разница в том, на какой стороне отношений вы находитесь. Если a
User
имеет aProfile
, то вUser
классе, который у вас есть,has_one :profile
и вProfile
классе, который у вас будетbelongs_to :user
. Чтобы определить, кто «имеет» другой объект, посмотрите, где находится внешний ключ. Мы можем сказать, чтоUser
«имеет» a,Profile
потому что вprofiles
таблице естьuser_id
столбец. Однако если быprofile_id
вusers
таблице был вызван столбец , мы бы сказали, что aProfile
имеет aUser
, и местоположения own_to / has_one поменяется местами.вот более подробное объяснение.
источник
Product belongs_to Shop
означает, что вproducts
таблице естьshop_id
столбецЭто о том, где находится внешний ключ.
belongs_to :bar
, то в таблице foos естьbar_id
столбецhas_one :bar
, то таблица баров имеетfoo_id
столбецНа концептуальном уровне, если у вас
class A
естьhas_one
отношения с,class B
тоclass A
вы являетесь родителем,class B
следовательно, у васclass B
будутbelongs_to
отношения с ним,class A
поскольку он является потомкомclass A
.Оба выражают отношения 1-1. Разница главным образом в том, где разместить внешний ключ, который идет на стол для класса, объявляющего
belongs_to
отношения.Таблицы для этих классов могут выглядеть примерно так:
источник
Account
иUser
в этом примере является неудачным, поскольку часто бывает, что у учетной записи может быть много пользователей.has_one
и,belongs_to
как правило, одинаковы в том смысле, что они указывают на другую связанную модель.belongs_to
убедитесь, что эта модель имеетforeign_key
определеннуюhas_one
гарантирует, что другойhas_foreign
ключ модели определен.Чтобы быть более конкретным, есть две стороны
relationship
, одна из которыхOwner
и другаяBelongings
. Еслиhas_one
определено только, мы можем получить его,Belongings
но не можем получитьOwner
изbelongings
. Чтобы отследить,Owner
нам нужно определитьbelongs_to
также и принадлежащую модель.источник
Еще одна вещь, которую я хочу добавить: предположим, у нас есть следующие ассоциации моделей
class Author < ApplicationRecord has_many :books end
если мы только напишем вышеупомянутую ассоциацию, то мы можем получить все книги определенного автора,
Но для конкретной книги мы не можем получить соответствующего автора,
чтобы приведенный выше код работал, нам нужно добавить ассоциацию в модель Book, например, так:
Это добавит метод 'author' в модель Book.
Подробнее о режиме см. Руководства
источник
С точки зрения простоты,
belongs_to
это лучше, чемhas_one
потомуhas_one
, что в , вы должны добавить следующие ограничения к модели и таблице, имеющей внешний ключ, для обеспеченияhas_one
взаимосвязи:validates :foreign_key, presence: true, uniqueness: true
источник