Qual è la differenza tra appartiene_to e has_one?


Risposte:


241

Sostanzialmente fanno la stessa cosa, l'unica differenza è da che parte della relazione sei. Se a Userha una Profile, allora nella Userclasse che avresti has_one :profilee nella Profileclasse che avresti belongs_to :user. Per determinare chi "ha" l'altro oggetto, guarda dove si trova la chiave esterna. Possiamo dire che un User"ha" un Profileperché la profilestabella ha una user_idcolonna. Se ci fosse una colonna chiamata profile_idsulla userstabella, tuttavia, diremmo che a Profileha a User, e le posizioni appartiene_to / has_one verrebbero scambiate.

ecco una spiegazione più dettagliata.


ok ha senso, has_a è proprietà, mentre a appartiene è più una relazione.
Blankman,

48
Per dirla in breve: Product belongs_to Shopsignifica che la productstabella ha una shop_idcolonna
Yo Ludke,

@ryeguy, che dire se questa è una relazione self-join?
Arian Faurtosh,

49

Riguarda dove si trova la chiave esterna.

class Foo < AR:Base
end
  • Se foo belongs_to :bar, la tabella foos ha una bar_idcolonna
  • Se foo has_one :bar, la tabella delle barre ha una foo_idcolonna

A livello concettuale, se il tuo class Aha una has_onerelazione con class Ballora class Aè il genitore class Bquindi la tua class Bvolontà avrà una belongs_torelazione class Adal momento che è la figlia di class A.

Entrambi esprimono una relazione 1-1. La differenza è soprattutto dove posizionare la chiave esterna, che va sul tavolo per la classe che dichiara la belongs_torelazione.

class User < ActiveRecord::Base
  # I reference an account.
  belongs_to :account
end

class Account < ActiveRecord::Base
  # One user references me.
  has_one :user
end

Le tabelle per queste classi potrebbero assomigliare a:

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)
)

È praticamente la stessa affermata dalla risposta accettata di due anni fa.
Matthias Krull,

11
Questa è praticamente una risposta migliore.
typeoneerror

L'uso di Accounte Userin questo esempio è sfortunato in quanto spesso un account può avere molti utenti.
karmakaze,

5

has_onee belongs_togeneralmente sono uguali nel senso che indicano l'altro modello correlato. belongs_toassicurarsi che questo modello abbia foreign_keydefinito. has_onesi assicura che sia has_foreigndefinita l'altra chiave del modello .

Per essere più specifici, ci sono due lati di relationship, uno è l' Owneraltro e l'altro è Belongings. Se has_oneviene definito solo possiamo ottenere il suo Belongingsma non possiamo ottenere Ownerdal belongings. Per rintracciare Ownerè necessario definire belongs_toanche il modello di appartenenza.


3

Un'altra cosa che voglio aggiungere è, supponiamo di avere la seguente associazione di modelli

class Author < ApplicationRecord has_many :books end

se scriviamo solo l'associazione di cui sopra, possiamo ottenere tutti i libri di un determinato autore di,

@books = @author.books

Ma per un libro particolare non possiamo ottenere l'autore corrispondente di,

@author = @book.author

per far funzionare il codice sopra riportato è necessario aggiungere anche un'associazione al modello Book, in questo modo

class Book < ApplicationRecord
  belongs_to :author
end

Ciò aggiungerà il metodo "autore" al modello del libro.
Per i dettagli sulla modalità, consultare le guide


0

Dal punto di vista della semplicità, belongs_toè meglio che has_oneperché has_one, dovresti aggiungere i seguenti vincoli al modello e alla tabella che ha la chiave esterna per imporre la has_onerelazione:

  • validates :foreign_key, presence: true, uniqueness: true
  • aggiungere un indice univoco del database sulla chiave esterna.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.