Qual é a diferença entre a belongs_to
e a has_one
?
Ler o guia Ruby on Rails não me ajudou.
ruby-on-rails
activerecord
Blankman
fonte
fonte
Respostas:
Eles essencialmente fazem a mesma coisa, a única diferença é de que lado do relacionamento você está. Se a
User
tiver umProfile
, naUser
classe que você teriahas_one :profile
e naProfile
classe que você teriabelongs_to :user
. Para determinar quem "possui" o outro objeto, observe onde está a chave estrangeira. Podemos dizer que umUser
"tem" aProfile
porque aprofiles
tabela possui umauser_id
coluna. Se houvesse uma coluna chamadaprofile_id
nausers
tabela, no entanto, diríamos que aProfile
possui aUser
, e os locais belongs_to / has_one seriam trocados.Aqui está uma explicação mais detalhada.
fonte
Product belongs_to Shop
meiosproducts
tabela temshop_id
colunaÉ sobre onde fica a chave estrangeira.
belongs_to :bar
, a tabela foos tem umabar_id
colunahas_one :bar
, a tabela de barras tem umafoo_id
colunaNo nível conceitual, se você
class A
tem umhas_one
relacionamento com ele,class B
entãoclass A
é o pai de,class B
portanto,class B
ele terá umbelongs_to
relacionamento comclass A
ele, pois é filho declass A
.Ambos expressam um relacionamento 1-1. A diferença é principalmente onde colocar a chave estrangeira, que fica na mesa da classe que declara o
belongs_to
relacionamento.As tabelas para essas classes podem se parecer com:
fonte
Account
eUser
neste exemplo é lamentável, pois geralmente é o caso em que uma conta pode ter muitos usuários.has_one
ebelongs_to
geralmente são iguais no sentido em que apontam para o outro modelo relacionado.belongs_to
certifique-se de que este modelo tenha oforeign_key
definido.has_one
garante que a outrahas_foreign
chave de modelo seja definida.Para ser mais específico, existem dois lados de
relationship
, um é oOwner
e outro éBelongings
. Se onlyhas_one
for definido, podemos obtê-lo,Belongings
mas não podemos obtê-lo aOwner
partir dobelongings
. Para rastrear oOwner
, precisamos definir obelongs_to
também no modelo pertencente.fonte
Outra coisa que quero acrescentar é: suponha que tenhamos a seguinte associação de modelos
class Author < ApplicationRecord has_many :books end
se escrevermos apenas a associação acima, poderemos obter todos os livros de um autor em particular,
Mas para um livro em particular, não podemos obter o autor correspondente por,
para que o código acima funcione, precisamos adicionar associação ao modelo Book também, como este
Isso adicionará o método 'author' ao modelo do livro.
Para detalhes do modo, consulte os guias
fonte
Do ponto de vista da simplicidade,
belongs_to
é melhor do quehas_one
porquehas_one
, você teria que adicionar as seguintes restrições ao modelo e tabela que possui a chave estrangeira para reforçar ohas_one
relacionamento:validates :foreign_key, presence: true, uniqueness: true
fonte