What_to और has_one के बीच क्या अंतर है?


जवाबों:


241

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

यहाँ एक अधिक विस्तृत व्याख्या है।


ठीक समझ में आता है, has_a संपत्ति है, जबकि एक संबंध से अधिक है।
ब्लैंकमैन

48
तो यह वास्तव में कम कहने के लिए: तालिका में स्तंभ का Product belongs_to Shopअर्थ productsहैshop_id
यो लुडके

@ryeguy, अगर यह सेल्फ ज्वाइन रिलेशनशिप है तो क्या होगा?
बजे एरियन फोरेटोश

49

यह उस बारे में है जहां विदेशी कुंजी बैठती है।

class Foo < AR:Base
end
  • यदि foo है 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)
)

यह बहुत पहले से ही दो साल पहले से स्वीकार किए गए उत्तर के समान है।
matthias krull

11
यह बहुत बेहतर जवाब है।
टाइपोनियरोर

इस उदाहरण का उपयोग Accountऔर Userदुर्भाग्यपूर्ण है क्योंकि अक्सर ऐसा होता है कि किसी खाते में कई उपयोगकर्ता हो सकते हैं।
कर्मकाज़े

5

has_oneऔर belongs_toआम तौर पर इस अर्थ में समान हैं कि वे अन्य संबंधित मॉडल को इंगित करते हैं। belongs_toसुनिश्चित करें कि इस मॉडल में foreign_keyपरिभाषित है। has_oneयह सुनिश्चित करता है कि अन्य मॉडल has_foreignकुंजी परिभाषित की गई है।

अधिक विशिष्ट होने के लिए, दो पक्ष हैं relationship, एक है Ownerऔर दूसरा है Belongings। यदि केवल 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, आपको निम्नलिखित बाधाओं को उस मॉडल और तालिका में जोड़ना होगा जिसमें has_oneरिश्ते को लागू करने के लिए विदेशी कुंजी है :

  • validates :foreign_key, presence: true, uniqueness: true
  • विदेशी कुंजी पर एक डेटाबेस अद्वितीय सूचकांक जोड़ें।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.