মুছে ফেলা সব বনাম ধ্বংস?


192

আমি একটি সারণী থেকে রেকর্ড মুছে ফেলার জন্য সেরা পদ্ধতির সন্ধান করছি। উদাহরণস্বরূপ, আমার এমন একটি ব্যবহারকারী রয়েছে যার ব্যবহারকারীর আইডি অনেকগুলি টেবিল জুড়ে রয়েছে। আমি এই ব্যবহারকারীর এবং সমস্ত টেবিলে তার আইডি রয়েছে এমন প্রতিটি রেকর্ড মুছতে চাই।

u = User.find_by_name('JohnBoy')
u.usage_indexes.destroy_all
u.sources.destroy_all
u.user_stats.destroy_all
u.delete

এটি সমস্ত সারণী থেকে ব্যবহারকারীর সমস্ত রেফারেন্সগুলি কাজ করে এবং সরিয়ে দেয়, তবে আমি শুনেছি যে destroy_allএটি খুব প্রক্রিয়াযুক্ত ছিল তাই আমি চেষ্টা করেছি delete_all। এটি কেবল ব্যবহারকারীকে তার নিজস্ব ব্যবহারকারীর টেবিল থেকে অপসারণ করে এবং idঅন্যান্য সমস্ত টেবিল থেকে নকল করা হয়, তবে সেগুলিতে রেকর্ড অক্ষত থাকে। কেউ কি এই জাতীয় কাজ সম্পাদন করার জন্য সঠিক প্রক্রিয়াটি কী তা ভাগ করে নিতে পারেন?

আমি দেখতে পাচ্ছি যে সমস্ত সম্পর্কিত অবজেক্টে ফাংশনটি destroy_allকল করে destroyতবে আমি ঠিক সঠিক পদ্ধতির নিশ্চয়তা দিতে চাই।

উত্তর:


243

তুমি ঠিক. আপনি যদি ব্যবহারকারী এবং সমস্ত সম্পর্কিত অবজেক্ট মুছতে চান -> destroy_all তবে আপনি যদি কেবলমাত্র সম্পর্কিত সমস্ত অবজেক্ট দমন না করে ব্যবহারকারীকে মুছতে চান ->delete_all

এই পোস্ট অনুসারে : রেলগুলি: নির্ভরশীল =>: ভিএস ধ্বংস করুন: নির্ভরশীল =>: মুছুন_ সমস্ত

  • destroy/ destroy_all: সম্পর্কিত অবজেক্টগুলি তাদের বিন্যাস পদ্ধতিতে কল করে এই বস্তুর পাশাপাশি নষ্ট হয়ে যায়
  • delete/ delete_all: সমস্ত সম্পর্কিত বস্তু তাদের: বিন্যাস পদ্ধতিটি না বলে তত্ক্ষণাত ধ্বংস হয়ে যায়

80
এটিও লক্ষ করা উচিত যে 1) কলব্যাকগুলি ব্যবহার করার সময় কল করা হয় না delete_all, এবং 2) destroy_allসমস্ত রেকর্ড ইনস্ট্যান্ট করে এবং সেগুলি একবারে একটিকে ধ্বংস করে দেয়, সুতরাং খুব বড় ডেটাসেটের সাহায্যে এটি যন্ত্রণাদায়কভাবে ধীর হতে পারে।
ডিলান মার্কো

ধরুন আমি মডেলটিতে একটি পূর্ব_ডস্ট্রয় পদ্ধতি চালাচ্ছি - আমি যদি ডিলিট_ল ব্যবহার করি তবে এই পদ্ধতিটি চলবে না? দ্বিতীয়ত যদি আমি আমার মডেলটিতে একটি পূর্বে_পদ্ধতি পদ্ধতি নিয়োগ করি তবে আমি কি রেল কনসোলে মুছে ফেলতে বা মুছুন_ চালাচ্ছি?
বিকেএসপুরজন

23

মুছে ফেলা সমস্তই একটি একক এসকিউএল মোছার বিবৃতি এবং আরও কিছু নয়। ধ্বংস_সকল কলগুলি সমস্ত মিলের ফলাফলগুলিতে () নষ্ট করে: শর্তসমূহ (যদি আপনার একটি থাকে) যা কমপক্ষে NUM_OF_RESULTS SQL বিবৃতি হতে পারে।

আপনার যদি বড় ডেটাসেটে ডিস্ট্রোন_ল () এর মতো কঠোর কিছু করতে হয় তবে আমি সম্ভবত অ্যাপটি থেকে এটি না করে যত্ন সহকারে ম্যানুয়ালি হ্যান্ডেল করব। যদি ডেটাসেটটি যথেষ্ট ছোট হয় তবে আপনি তেমন আঘাত করবেন না।


16

destroy_allসমস্ত রেকর্ড ইনস্ট্যান্ট করে এবং একবারে সেগুলি একবারে ধ্বংস করে দেয় এই বিষয়টি এড়াতে , আপনি এটি সরাসরি মডেল ক্লাস থেকে ব্যবহার করতে পারেন।

এর পরিবর্তে:

u = User.find_by_name('JohnBoy')
u.usage_indexes.destroy_all

আপনি করতে পারেন :

u = User.find_by_name('JohnBoy')
UsageIndex.destroy_all "user_id = #{u.id}"

ফলাফল সম্পর্কিত সম্পর্কিত সমস্ত রেকর্ড নষ্ট করার জন্য একটি প্রশ্ন query


1
এটি কি সম্পর্কিত রেকর্ডগুলিতে ধ্বংস কলব্যাকগুলি কল করবে, বা এর সাথে UsageIndex.destroy_allসমান UsageIntex.delete_all?
ম্যাগনে

UsageIndex.destroy_allরেল 3 থেকে এখন আর উপলভ্য নয়
ফ্যাব্রিকিওফ্রেইট্যাগ

1

আমি একটি ছোট মণি তৈরি করেছি যা কিছু পরিস্থিতিতে ম্যানুয়ালি সম্পর্কিত রেকর্ডগুলি মুছতে পারে।

এই রত্নটি অ্যাক্টিভেকর্ড সংঘের জন্য একটি নতুন বিকল্প যুক্ত করেছে:

নির্ভরশীল:: মুছে ফেলা_ পুনরুদ্ধার করুন

আপনি যখন কোনও রেকর্ড নষ্ট করেন, এই বিকল্পটি ব্যবহার করে যুক্ত সমস্ত রেকর্ডগুলির কোনও তাত্ক্ষণিক না করে পুনরাবৃত্তভাবে (অর্থাত্ মডেল জুড়ে) মুছে ফেলা হবে।

নোট করুন, ঠিক নির্ভরশীলের মতো:: মুছুন বা নির্ভর করুন:: মুছুন_ সমস্ত, এই নতুন বিকল্পটি নির্ভরশীল রেকর্ডগুলির কাছাকাছি / আগে / পরে_ডাস্ট্রয়ে কলব্যাকগুলি ট্রিগার করে না।

যাইহোক, নির্ভরশীল হওয়া সম্ভব:: অন্যথায় নির্ভরশীলদের সাথে সম্পর্কিত এমন একটি শৃঙ্খল মডেলগুলির মধ্যে যে কোনও জায়গায় অ্যাসোসিয়েশনগুলি ধ্বংস করুন:: মুছে দিন_প্রকারণে। ধ্বংস: বিকল্পটি লাইনটি উপরে বা নীচে যে কোনও জায়গায় স্বাভাবিকভাবে কাজ করবে, সমস্ত প্রাসঙ্গিক রেকর্ড তাত্ক্ষণিকভাবে ধ্বংস করবে এবং তাদের কলব্যাকগুলি ট্রিগার করবে।


এটি চমৎকার! আমি আশ্চর্য হয়েছি কেন আরও লোকেরা এটি গিথুবটিতে দেখে / তারকাচিহ্নিত করেছেন / কাঁটাচামচ করছেন না ... এটি কি এখনও ভাল চলছে?
ম্যাগনে

@ ম্যাগনে ধন্যবাদ! এটা কাজ করা উচিত। পরীক্ষাগুলি রুবি ২.৪.১ এবং ব্যান্ডগুলি 5.1.1 এ চলছে run এখনও অবধি আমি কেবল এটি ব্যক্তিগতভাবে ব্যবহার করেছি এবং বড় প্রযোজনা অ্যাপগুলিতে নয়, তাই প্রধান সংস্করণ "0", তবে আমি কখনই কোনও সমস্যা লক্ষ্য করিনি। এটিও মোটামুটি সহজ, সুতরাং এটি ঠিক করা উচিত।
জানোশ

কুল। :) আমি রুবি ২.৩.১ এবং 'রেলস', '~> ৪.১.১৪' তে একটি প্রকল্প চালাচ্ছি এবং দুঃখের সাথে অন্যান্য রত্নগুলির কারণে অ্যাক্টিভেকর্ডের (4.> 4.1.0) উপর নির্ভর করতে বাধ্য হচ্ছি। আমি দেখতে পাচ্ছি মোছার_সংশ্লিষ্ট 0,9.0 এ সমাধান করা হয়েছে। এটির কোনও পুরানো সংস্করণ রয়েছে যা অ্যাক্টিভেকর্ড 4.1 নিয়ে কাজ করবে? গিথুব-এ প্রকাশের ট্যাবে আমি কোনও খুঁজে পাইনি।
ম্যাগনে

1
@ ম্যাগনে আমি দেখতে পেলাম যে এটি অ্যাক্টিভেরকর্ডের পক্ষে 4.1.14 এর চেয়ে কম হিসাবে কাজ করে এবং একটি স্বচ্ছল নির্ভরতার সাথে রত্ন সংস্করণ 1.0.0 প্রকাশ করেছে। মনে রাখবেন যে যদিও রেলগুলির 4.1 শাখা সুরক্ষা আপডেটগুলি আর গ্রহণ করে না।
জানোশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.