2010-09-28 11 views
103

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

रेल गाइड पर रुबी पढ़ना मेरी मदद नहीं करता है।

+3

संभावित डुप्लिकेट [\ _one के बीच अंतर और रेल में संबंधित है \ _to?] (Http://stackoverflow.com/questions/861144/difference-between-has-one-and-belongs -टू-इन-रेल) – Nakilon

उत्तर

161

वे अनिवार्य रूप से वही काम करते हैं, केवल अंतर ही आपके रिश्ते के किनारे पर है। यदि User में Profile है, तो User कक्षा में आपके पास has_one :profile और Profile कक्षा में आपके पास belongs_to :user होगा। यह निर्धारित करने के लिए कि अन्य वस्तु किसके पास है, देखें कि विदेशी कुंजी कहां है। हम कह सकते हैं कि User "है" Profile क्योंकि profiles तालिका में user_id कॉलम है। users तालिका पर profile_id नामक कॉलम था, हालांकि, हम कहेंगे कि Profile में User है, और संबंधित_to/has_one स्थानों को बदल दिया जाएगा।

here एक और विस्तृत स्पष्टीकरण है।

+0

ठीक है समझ में आता है, है_ए संपत्ति है, जबकि एक संबंधित संबंध अधिक है। – Blankman

+8

अच्छा ब्लॉग [इस पर] (http://requiremind.com/differences-between-has-one-and-belongs-to-in-ruby-on-rails/)। –

+20

तो यह वास्तव में संक्षिप्त कहने के लिए: 'उत्पाद संबंधित है' दुकान 'का अर्थ है' उत्पादों 'तालिका में 'shop_id' कॉलम –

31

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

class Foo < AR:Base 
end 
  • foo belongs_to :bar, तो कम महत्वपूर्ण चीज़ें तालिका एक bar_id कॉलम है
  • foo has_one :bar, तो सलाखों तालिका एक foo_id स्तंभ

वैचारिक स्तर पर, हो तो यदि आपके class Ahas_oneclass B के साथ संबंध है तो class Aclass B का अभिभावक है इसलिए आपका class B के साथ belongs_to संबंध होगा क्योंकि यह class A का बच्चा है।

दोनों एक 1-1 संबंध व्यक्त करते हैं। अंतर यह है कि अधिकतर विदेशी कुंजी कहां रखना है, जो belongs_to संबंध घोषित करने वाले वर्ग के लिए तालिका में जाता है।

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) 
) 
+0

है जो दो साल पहले से ही पहले से ही स्वीकृत उत्तर जैसा ही है। –

+7

यह काफी बेहतर जवाब है। – typeoneerror

3

has_one और आम तौर पर 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 

इन कक्षाओं लिए टेबल की तरह कुछ लग सकता है। belongs_to सुनिश्चित करें कि इस मॉडल में foreign_key परिभाषित है। has_one यह सुनिश्चित करता है कि अन्य मॉडल has_foreign कुंजी परिभाषित किया गया है।

अधिक विशिष्ट होने के लिए, relationship के दो पक्ष हैं, एक Owner है और अन्य Belongings है। यदि केवल has_one परिभाषित किया गया है तो हम इसे Belongings प्राप्त कर सकते हैं लेकिन belongings से Owner प्राप्त नहीं कर सकते हैं। Owner का पता लगाने के लिए हमें belongs_to को संबंधित मॉडल में भी परिभाषित करने की आवश्यकता है।

0

एक अतिरिक्त बात यह है कि मैं जोड़ने के लिए है, तो हम मान लीजिए चाहते मॉडल संघ निम्नलिखित है

class Author < ApplicationRecord has_many :books end

अगर हम केवल ऊपर संघ बारे में तो हम से,

एक विशेष लेखक की सभी पुस्तकों प्राप्त कर सकते हैं
@books = @author.books 

लेकिन एक विशेष पुस्तक के लिए हम से इसी लेखक नहीं मिल सकता है,

@author = @book.author 

इस

class Book < ApplicationRecord 
    belongs_to :author 
end 

इस तरह उपरोक्त कोड काम काम हम भी बुक मॉडल के लिए संघ जोड़ने की जरूरत है, बनाने के लिए बुक मॉडल के लिए विधि 'लेखक' जोड़ देगा।
मोड विवरण के लिए guides

संबंधित मुद्दे