ความแตกต่างระหว่าง 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 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)
)
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