ความแตกต่างระหว่าง a belongs_to
และ a has_one
คืออะไร?
การอ่านคู่มือ Ruby on Rails ไม่ได้ช่วยฉัน
ความแตกต่างระหว่าง a belongs_to
และ a has_one
คืออะไร?
การอ่านคู่มือ Ruby on Rails ไม่ได้ช่วยฉัน
คำตอบ:
โดยพื้นฐานแล้วพวกเขาทำสิ่งเดียวกันความแตกต่างเพียงอย่างเดียวคือด้านความสัมพันธ์ที่คุณอยู่ ถ้า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 จะถูกสลับ
นี่คือคำอธิบายโดยละเอียดเพิ่มเติม
Product belongs_to Shop
หมายถึงproducts
ตารางมีshop_id
คอลัมน์
มันเกี่ยวกับที่ที่กุญแจต่างประเทศนั่งอยู่
class Foo < AR:Base
end
belongs_to :bar
ดังนั้นตาราง foos จะมีbar_id
คอลัมน์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)
)
Account
และUser
ในตัวอย่างนี้โชคไม่ดีเนื่องจากมักจะเป็นกรณีที่บัญชีสามารถมีผู้ใช้จำนวนมาก
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
วิธีนี้จะเพิ่มวิธี 'ผู้แต่ง' ให้กับแบบจำลองหนังสือ
สำหรับรายละเอียดโหมดดูคำแนะนำ
จากมุมมองความเรียบง่ายbelongs_to
ดีกว่าhas_one
เพราะใน has_one
คุณจะต้องเพิ่มข้อ จำกัด ต่อไปนี้ในรูปแบบและตารางที่มี foreign key เพื่อบังคับใช้has_one
ความสัมพันธ์:
validates :foreign_key, presence: true, uniqueness: true