जवाबों:
वे अनिवार्य रूप से एक ही काम करते हैं, फर्क सिर्फ इतना है कि आप किस रिश्ते में हैं। यदि आपके 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