রেল 6
6 রেলগুলি একটি upsert
এবং upsert_all
পদ্ধতিগুলি যুক্ত করেছে যা এই কার্যকারিতা সরবরাহ করে।
Model.upsert(column_name: value)
[উত্থাপন] এটি কোনও মডেলকে তাত্পর্যপূর্ণ করে না এবং এটি সক্রিয় রেকর্ড কলব্যাকস বা বৈধতাগুলিকে ট্রিগার করে না।
5, 4, এবং 3 এর কড়া
আপনি যদি কোনও "উপস্থাপক" (যেখানে একই ডাটাবেসটিতে কোনও আপডেট বা একটি সন্নিবেশ বিবৃতি কার্যকর করে) ধরণের বিবৃতি সন্ধান করছেন Not বাক্সের বাইরে, রেলস এবং অ্যাক্টিভেকর্ডের এমন কোনও বৈশিষ্ট্য নেই। তবে আপনি উপগ্রহ রত্নটি ব্যবহার করতে পারেন ।
অন্যথায়, আপনি ব্যবহার করতে পারেন: 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")
কারাগারে 3।
user = User.find_or_initialize_by_name("Roger")
user.email = "email@example.com"
user.save
আপনি একটি ব্লক ব্যবহার করতে পারেন, তবে রেকর্ডটি নতুন হলে কেবল ব্লকটি চলে ।
User.where(name: "Roger").first_or_initialize do |user|
user.save
end
User.find_or_initialize_by(name: "Roger") do |user|
user.save
end
আপনি যদি রেকর্ডের অধ্যবসায়ের কথা বিবেচনা না করেই কোনও ব্লক ব্যবহার করতে চান তবে ফলাফলটিতে ব্যবহার tap
করুন:
User.where(name: "Roger").first_or_initialize.tap do |user|
user.email = "email@example.com"
user.save
end