В чем разница между принадлежащим и has_one? - PullRequest
132 голосов
/ 28 сентября 2010

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

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

Ответы [ 4 ]

203 голосов
/ 28 сентября 2010

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

здесь - более подробное объяснение.

42 голосов
/ 04 октября 2012

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

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.Разница главным образом в том, где разместить внешний ключ, который идет на стол для класса, объявляющего отношение 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

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

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)
)
4 голосов
/ 17 сентября 2015

has_one и belongs_to, как правило, одинаковы в том смысле, что они указывают на другую связанную модель.belongs_to убедитесь, что для этой модели определен foreign_key.has_one удостоверяется, что определена клавиша has_foreign другой модели.

Чтобы быть более точным, есть две стороны relationship, одна из которых Owner, а другая Belongings.Если определен только has_one, мы можем получить его Belongings, но не можем получить Owner из belongings.Чтобы отследить Owner, нам нужно определить belongs_to также в соответствующей модели.

1 голос
/ 26 февраля 2018

Я хочу добавить еще одну вещь: предположим, у нас есть следующие ассоциации моделей

class Author < ApplicationRecord has_many :books end

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

@books = @author.books

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

@author = @book.author

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

class Book < ApplicationRecord
  belongs_to :author
end

Это добавит метод 'author' к модели Book.
Подробнее о режиме см. guides

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