ความแตกต่างระหว่าง poss_to และ has_one คืออะไร


154

ความแตกต่างระหว่าง a belongs_toและ a has_oneคืออะไร?

การอ่านคู่มือ Ruby on Rails ไม่ได้ช่วยฉัน


คำตอบ:


241

โดยพื้นฐานแล้วพวกเขาทำสิ่งเดียวกันความแตกต่างเพียงอย่างเดียวคือด้านความสัมพันธ์ที่คุณอยู่ ถ้าUserมีProfileแล้วในUserระดับที่คุณจะต้องhas_one :profileและอยู่ในระดับที่คุณจะต้องProfile belongs_to :userเมื่อต้องการกำหนดว่าใคร "มี" วัตถุอื่นดูที่คีย์ต่างประเทศอยู่ เราสามารถพูดได้ว่าUser"มี" a Profileเพราะprofilesตารางมีuser_idคอลัมน์ หากมีคอลัมน์ที่เรียกว่าprofile_idบนusersตารางเราจะบอกว่า a ProfileมีUserและสถานที่ตั้งของ poss_to / has_one จะถูกสลับ

นี่คือคำอธิบายโดยละเอียดเพิ่มเติม


ตกลงทำให้รู้สึก has_a เป็นทรัพย์สินในขณะที่เป็นของความสัมพันธ์มากกว่า
Blankman

48
ดังนั้นจะบอกว่ามันสั้นจริง ๆ : Product belongs_to Shopหมายถึงproductsตารางมีshop_idคอลัมน์
Yo Ludke

@ryeguy จะเป็นอย่างไรถ้านี่คือความสัมพันธ์ในการเข้าร่วมด้วยตนเอง?
Arian Faurtosh

49

มันเกี่ยวกับที่ที่กุญแจต่างประเทศนั่งอยู่

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

นั่นเป็นคำตอบที่ยอมรับจากสองปีที่ผ่านมา
matthias krull

11
นี่เป็นคำตอบที่ดีกว่ามาก
typeoneerror

การใช้งานAccountและUserในตัวอย่างนี้โชคไม่ดีเนื่องจากมักจะเป็นกรณีที่บัญชีสามารถมีผู้ใช้จำนวนมาก
karmakaze

5

has_oneและbelongs_toโดยทั่วไปจะเหมือนกันในแง่ที่ว่าพวกเขาชี้ไปที่โมเดลอื่นที่เกี่ยวข้อง belongs_toตรวจสอบให้แน่ใจว่ารุ่นนี้มีการforeign_keyกำหนดไว้ has_oneตรวจสอบให้แน่ใจว่าได้has_foreignกำหนดคีย์รุ่นอื่น ๆแล้ว

จะเฉพาะเจาะจงมากขึ้นมีทั้งสองด้านของrelationshipหนึ่งเป็นและมีที่อื่นOwnerBelongingsถ้าเพียง แต่has_oneมีการกำหนดเราจะได้รับของBelongingsแต่ไม่สามารถได้รับประโยชน์จากOwner belongingsเพื่อติดตามOwnerเราจำเป็นต้องกำหนดbelongs_toเช่นกันในรูปแบบที่เป็นของ


3

อีกสิ่งหนึ่งที่ฉันต้องการเพิ่มคือสมมติว่าเรามีการเชื่อมโยงแบบจำลองต่อไปนี้

class Author < ApplicationRecord has_many :books end

ถ้าเราเพียงเขียนสมาคมด้านบนเราสามารถรับหนังสือทั้งหมดของผู้แต่งโดย

@books = @author.books

แต่สำหรับหนังสือเล่มใดเล่มหนึ่งเราไม่สามารถนำผู้เขียนที่เกี่ยวข้องมาได้

@author = @book.author

เพื่อให้โค้ดข้างต้นทำงานได้เราจำเป็นต้องเพิ่มการเชื่อมโยงกับรูปแบบหนังสือด้วยเช่นนี้

class Book < ApplicationRecord
  belongs_to :author
end

วิธีนี้จะเพิ่มวิธี 'ผู้แต่ง' ให้กับแบบจำลองหนังสือ
สำหรับรายละเอียดโหมดดูคำแนะนำ


0

จากมุมมองความเรียบง่ายbelongs_toดีกว่าhas_oneเพราะใน has_oneคุณจะต้องเพิ่มข้อ จำกัด ต่อไปนี้ในรูปแบบและตารางที่มี foreign key เพื่อบังคับใช้has_oneความสัมพันธ์:

  • validates :foreign_key, presence: true, uniqueness: true
  • เพิ่มดัชนีเฉพาะฐานข้อมูลบน foreign key
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.