रेलें ६
रेल 6 ने एक upsert
और upsert_all
तरीके जोड़े जो इस कार्यक्षमता को वितरित करते हैं।
Model.upsert(column_name: value)
[upsert] यह किसी भी मॉडल को त्वरित नहीं करता है और न ही सक्रिय रिकॉर्ड कॉलबैक या सत्यापन को ट्रिगर करता है।
रेल 5, 4, और 3
नहीं यदि आप एक "upsert" की तलाश कर रहे हैं (जहाँ डेटाबेस एक अद्यतन या एक ही ऑपरेशन में एक सम्मिलित कथन निष्पादित करता है) प्रकार का बयान। बॉक्स से बाहर, रेल और ActiveRecord में ऐसी कोई सुविधा नहीं है। आप अपटाउन का उपयोग कर सकते हैं हालांकि मणि,।
अन्यथा, आप उपयोग कर सकते हैं: find_or_initialize_by
याfind_or_create_by
, जो समान कार्यक्षमता प्रदान करते हैं, एक अतिरिक्त डेटाबेस हिट की कीमत पर, जो कि ज्यादातर मामलों में, शायद ही कोई मुद्दा है। इसलिए जब तक आपको गंभीर प्रदर्शन की चिंता नहीं है, मैं मणि का उपयोग नहीं करूंगा।
उदाहरण के लिए, यदि कोई उपयोगकर्ता "रोजर" नाम के साथ नहीं पाया जाता है, तो एक नया उपयोगकर्ता उदाहरण name
"रोजर" के लिए सेट किया गया है।
user = User.where(name: "Roger").first_or_initialize
user.email = "email@example.com"
user.save
वैकल्पिक रूप से, आप उपयोग कर सकते हैं find_or_initialize_by
।
user = User.find_or_initialize_by(name: "Roger")
रेल में ३।
user = User.find_or_initialize_by_name("Roger")
user.email = "email@example.com"
user.save
आप एक ब्लॉक का उपयोग कर सकते हैं, लेकिन रिकॉर्ड नया होने पर ही ब्लॉक चलता है ।
User.where(name: "Roger").first_or_initialize do |user|
# this won't run if a user with name "Roger" is found
user.save
end
User.find_or_initialize_by(name: "Roger") do |user|
# this also won't run if a user with name "Roger" is found
user.save
end
यदि आप रिकॉर्ड की दृढ़ता की परवाह किए बिना ब्लॉक का उपयोग करना चाहते हैं, tap
तो परिणाम पर उपयोग करें :
User.where(name: "Roger").first_or_initialize.tap do |user|
user.email = "email@example.com"
user.save
end