2011-08-11 14 views
12

मेरे पास एक उपयोगकर्ता है जिसके पास 0 या 1 प्रोफाइल हो सकते हैं। मेरी नियंत्रक में, मैं, प्रोफ़ाइल को बचाने के लिए है, तो मूल्यों के कुछ दिया जाता है चाहता हूँ इस प्रकार है:ActiveRecord संबंधों में निर्माण और निर्माण विधि के बीच क्या अंतर है?

# PUT /users/1 
def update 
    @user = User.find(params[:id]) 

    if @user.update_attributes(params[:user]) 
    if params[:profile][:available] == 1 #available is a checkbox that stores a simple flag in the database. 
     @user.create_profile(params[:profile]) 
    end 
    else 
    #some warnings and errors 
    end 
end 

हिस्सा मैं के बारे में सोच रहा हूँ create_profile है, जादू create_somerelationname। यह जादू build_somerelationname से तुलना कैसे करता है? और मुझे कब उपयोग करना चाहिए?

उत्तर

17

build और create के बीच का अंतर यह है कि निर्माण भी बनाए गए ऑब्जेक्ट को सहेजता है क्योंकि बिल्ड केवल नव निर्मित ऑब्जेक्ट को लौटाता है (इसे अभी तक सहेजा जा रहा है)।

प्रलेखन कुछ हद तक छिपा हुआ है here

तो, निर्भर करता है कि आप वापस आ वस्तु या नहीं से खुश हैं, आप की जरूरत create क्रमशः (क्योंकि आप इसे अब और नहीं बदलेगा) build के रूप में आप फिर से सहेजने से पहले इसे अपडेट करना (यदि आप एक ऑपरेशन को बचाने की बचत होगी जो)

+0

लिंक सही जगह पर इंगित नहीं करता है ... – mahatmanich

+0

@mahatmanich उल्लेख करने के लिए धन्यवाद, मैंने लिंक अपडेट किया है। – Veger

10

@user.build_profile

Profile.new(:user_id => @user.id) 

रूप में ही है, जबकि @user.create_profile

Profile.create(:user_id => @user.id) 

@user.create_profile के रूप में ही इस तरह build_profile साथ प्रस्तुत किया जा सकता है:

profile = @user.build_profile 
profile.save 

http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one

6
guide

build_association से

(विशेषताओं = {})

build_association विधि एक नई वस्तु ओ रिटर्न एफ प्रकार से संबंधित है। इस ऑब्जेक्ट को उत्तीर्ण विशेषताओं से तुरंत चालू किया जाएगा, और इसकी विदेशी कुंजी के माध्यम से लिंक सेट किया जाएगा, लेकिन संबंधित ऑब्जेक्ट अभी तक सहेजा नहीं जाएगा।

create_association (विशेषताओं = {})

create_association विधि जुड़े प्रकार का एक नया वस्तु देता है। इस ऑब्जेक्ट को उत्तीर्ण विशेषताओं से तुरंत चालू किया जाएगा, और इसकी विदेशी कुंजी के माध्यम से लिंक सेट किया जाएगा। इसके अतिरिक्त, संबंधित ऑब्जेक्ट सहेजा जाएगा (यह मानते हुए कि यह मान्यताओं को पास करता है)।

आपको क्या उपयोग करना चाहिए आवश्यकता पर निर्भर करता है। आम तौर पर build_association नई विधि में उपयोग किया जाता है।

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