2011-03-28 7 views
9

ActiveRecord find_or_create_by गतिशील खोजक विधि मुझे ब्लॉक निर्दिष्ट करने की अनुमति देती है। दस्तावेज इस पर स्पष्ट नहीं है, लेकिन ऐसा लगता है कि ब्लॉक केवल निर्माण मामले में चलता है, न कि मामले में। दूसरे शब्दों में, यदि रिकॉर्ड मिलता है, तो ब्लॉक नहीं चलता है। मैंने इस कंसोल कोड के साथ इसका परीक्षण किया:रेल खोज find_or_create_by जहां ब्लॉक मामले में ब्लॉक चलता है?

User.find_or_create_by_name("An Existing Name") do |u| 
    puts "I'M IN THE BLOCK" 
end 

(कुछ भी मुद्रित नहीं किया गया था)। क्या दोनों मामलों में ब्लॉक चलाने का कोई तरीका है?

उत्तर

20

जहां तक ​​मुझे समझ में आता है कि कुछ भी नहीं मिला तो ब्लॉक को निष्पादित किया जाएगा। इसके बारे में USECASE इस तरह दिखता है:

User.find_or_create_by_name("Pedro") do |u| 
    u.money = 0 
    u.country = "Mexico" 
    puts "User is created" 
end 

उपयोगकर्ता नहीं मिला है, तो यह नाम "पेड्रो" और ब्लॉक के अंदर यह सब सामान के साथ नए उपयोगकर्ता प्रारंभ होगा और नए बनाए गए उपयोगकर्ता वापस आ जाएगी। यदि उपयोगकर्ता मौजूद है तो यह ब्लॉक को निष्पादित किए बिना इस उपयोगकर्ता को वापस कर देगा।

इसके अलावा, आप उपयोग कर सकते हैं "ब्लॉक शैली" अन्य तरीकों की तरह:

User.create do |u| 
    u.name = "Pedro" 
    u.money = 1000 
end 

यह User.create(:name => "Pedro", :money => 1000) के रूप में भी ऐसा ही होगा, लेकिन लग रहा है थोड़ा अच्छे

और

User.find(19) do |u| 
    .. 
end 

आदि

+0

यह एक जीवन बचतकर्ता था, धन्यवाद। –

9

ऐसा प्रतीत नहीं होता है कि इस सवाल का वास्तव में उत्तर दिया गया है, इसलिए मैं करूंगा । मुझे लगता है कि यह सबसे आसान तरीका है, आप इसे प्राप्त कर सकते हैं:

User.find_or_create_by_name("An Existing Name or Non Existing Name").tap do |u| 
    puts "I'M IN THE BLOCK REGARDLESS OF THE NAME'S EXISTENCE" 
end 

चीयर्स!

+0

आपने 'टैप' का उपयोग किया है जो 'find_or ...' के परिणाम को वापस कर देगा, इसलिए वास्तव में ब्लॉक को ढूंढने में नहीं है, लेकिन टैप में! –

+0

ध्यान दें कि यदि आपकी तालिका में कोई शून्य बाधा नहीं है जो आपके द्वारा खोजे जा रहे फ़ील्ड से संतुष्ट नहीं है, तो कॉलिंग टैप ActiveRecord :: स्टेटमेंट इनवालिड बढ़ाएगा –

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