В чем разница между именами принадлежностью и has_one?

В чем разница между belongs_to и has_one ?

Чтение руководства Ruby on Rails мне не помогло.

Они по сути делают то же самое, единственная разница в том, в какой стороне отношений вы находитесь. Если у User есть Profile , то в classе User вас есть has_one :profile и в classе Profile вы должны belongs_to :user . Чтобы определить, кто «имеет» другой объект, посмотрите, где находится внешний ключ. Мы можем сказать, что у User «есть» Profile потому что таблица profiles имеет столбец user_id . Если бы был столбец с именем profile_id в таблице users , мы бы сказали, что у Profile есть User , а места, принадлежащие role_to / has_one, будут заменены.

вот более подробное объяснение.

Речь идет о том, где находится внешний ключ.

 class Foo < AR:Base end 
  • Если foo belongs_to :bar , то таблица foos имеет столбец bar_id
  • Если foo 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. Разница в основном заключается в том, где поместить внешний ключ, который идет по таблице для classа, объявляющего отношения belongs_to .

 class User < ActiveRecord::Base # I reference an account. belongs_to :account end class Account < ActiveRecord::Base # One user references me. has_one :user end 

Таблицы для этих classов могут выглядеть примерно так:

 CREATE TABLE users ( id int(11) NOT NULL auto_increment, account_id int(11) default NULL, name varchar default NULL, PRIMARY KEY (id) ) CREATE TABLE accounts ( id int(11) NOT NULL auto_increment, name varchar default NULL, PRIMARY KEY (id) ) 

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

если мы только напишем вышеприведенную ассоциацию, то мы можем получить все книги конкретного автора,

 @books = @author.books 

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

 @author = @book.author 

для того, чтобы работа над этим кодом работала, нам нужно также добавить ассоциацию к Книжной модели, например

 class Book < ApplicationRecord belongs_to :author end 

Это добавит метод «автор» к книге «Модель».
Детали режима см. В руководствах

Давайте будем гением компьютера.