जवाबों:
वे अनिवार्य रूप से एक ही काम करते हैं, फर्क सिर्फ इतना है कि आप किस रिश्ते में हैं। यदि आपके Userपास एक है Profile, तो Userकक्षा में आपके पास है has_one :profileऔर उस Profileकक्षा में जो आपके पास होगा belongs_to :user। यह निर्धारित करने के लिए कि दूसरी वस्तु किसके पास है, यह देखें कि विदेशी कुंजी कहां है। हम कह सकते हैं कि User"में" है Profileक्योंकि profilesतालिका में एक user_idकॉलम है। यदि मेज profile_idपर एक कॉलम कहा जाता है users, तो हम कहेंगे कि a Profileमें a Userऔर a_s_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, आपको निम्नलिखित बाधाओं को उस मॉडल और तालिका में जोड़ना होगा जिसमें has_oneरिश्ते को लागू करने के लिए विदेशी कुंजी है :
validates :foreign_key, presence: true, uniqueness: true