উত্তর:
মূলত destroy
মডেলটিতে কোনও কলব্যাক চালায়delete
না।
থেকে পাগল এপিআই :
ActiveRecord::Persistence.delete
ডাটাবেসে রেকর্ড মুছে ফেলে এবং এই পরিবর্তনটি প্রতিবিম্বিত করে যে কোনও পরিবর্তন করা উচিত নয় (যেহেতু সেগুলি ধরে রাখা যায় না)। হিমায়িত দৃষ্টান্তটি প্রদান করে।
রেকর্ডের প্রাথমিক কীতে একটি এসকিউএল মোছার বিবৃতি দিয়ে সারিটি সরানো হয় এবং কোনও কলব্যাক কার্যকর করা হয় না।
অবজেক্টের পূর্বের_ডাস্ট্রয় এবং পরে_ডাস্ট্রয়ে কলব্যাকস বা যে কোনও প্রয়োগ করতে: নির্ভরশীল সমিতি বিকল্পগুলি, # ডস্ট্রোয় ব্যবহার করুন।
ActiveRecord::Persistence.destroy
ডাটাবেসে রেকর্ড মুছে ফেলে এবং এই পরিবর্তনটি প্রতিবিম্বিত করে যে কোনও পরিবর্তন করা উচিত নয় (যেহেতু সেগুলি ধরে রাখা যায় না)।
ধ্বংসের সাথে যুক্ত রয়েছে একটি সিরিজ কলব্যাক। পূর্ব_ডাস্ট্রয় কলব্যাক মিথ্যা হলে অ্যাকশন বাতিল হয়ে যায় এবং মিথ্যা রিটার্নস ধ্বংস করে দেয়। অ্যাক্টিভেকর্ড :: আরও তথ্যের জন্য কলব্যাকগুলি দেখুন।
model#before_destroy
যা destroy()
নির্দিষ্ট শর্তে চূড়ান্ত কলটি থামাতে ব্যবহার করা যেতে পারে ।
delete
কেবলমাত্র ডিবি থেকে বর্তমান অবজেক্ট রেকর্ড মুছে ফেলবে তবে ডিবি থেকে এর সম্পর্কিত শিশুদের রেকর্ড নয়।
destroy
ডিবি থেকে বর্তমান অবজেক্ট রেকর্ড এবং ডিবি থেকে এর সম্পর্কিত শিশুদের রেকর্ড মুছবে।
তাদের ব্যবহার সত্যিই গুরুত্বপূর্ণ:
যদি আপনার একাধিক অভিভাবক অবজেক্টগুলি সাধারণ শিশুদের অবজেক্টগুলিকে ভাগ destroy
করে দেয় তবে নির্দিষ্ট প্যারেন্ট অবজেক্টে কল করা বাচ্চাদের অবজেক্টগুলি মুছে ফেলবে যা অন্যান্য একাধিক পিতামাতার মধ্যে ভাগ করা আছে।
destroy
নয় উত্তরপুরূষ , না শিশু : ডকুমেন্টেশন, ধ্বংস অনুযায়ী "বৈশিষ্ট্যাবলী থেকে একটি নতুন বস্তু তৈরি করে এবং পরে কল এটা ধ্বংস।" রুবডোক.ইন.ফো
আপনি যখন অনুরোধ করেন destroy
বা destroy_all
কোনও ActiveRecord
অবজেক্টে, ActiveRecord
'ধ্বংস' প্রক্রিয়া শুরু করা হয়, এটি আপনি মুছে ফেলছেন এমন শ্রেণীর বিশ্লেষণ করে, এটি নির্ভর করে যে কী করা উচিত তা নির্ধারণ করে, বৈধতার মাধ্যমে চালিত হয় ইত্যাদি
আপনি যখন অনুরোধ করেন delete
বা delete_all
কোনও অবজেক্টে, ActiveRecord
কেবল ডিবিটির DELETE FROM tablename WHERE conditions
বিরুদ্ধে কোয়েরিটি চালানোর চেষ্টা করেন, অন্য কোনও ActiveRecord
স্তরের কোনও কার্য সম্পাদন করে না ।
হ্যাঁ দুটি পদ্ধতির মধ্যে একটি প্রধান পার্থক্য রয়েছে আপনি যদি মডেল কলব্যাকগুলি কল না করে দ্রুত রেকর্ডগুলি মুছতে চান তবে মুছুন_এলটি ব্যবহার করুন
আপনি যদি আপনার মডেল কলব্যাকগুলি সম্পর্কে যত্নশীল হন তবে ডাস্টন_ল ব্যবহার করুন
অফিসিয়াল ডক্স থেকে
http://apidock.com/rails/ActiveRecord/Base/destroy_all/class
नष्ट করা সমস্ত (শর্তাবলী = শূন্য) সর্বজনীন
প্রতিটি রেকর্ড তাত্ক্ষণিকভাবে এবং এর ধ্বংস পদ্ধতিতে কল করে রেকর্ডের সাথে মেলে শর্তগুলি ধ্বংস করে। প্রতিটি বস্তুর কলব্যাকগুলি কার্যকর করা হয় (সহ: নির্ভরশীল সমিতি বিকল্পগুলি এবং পূর্ববর্তী_ডেসট্রয় / আফটার_ডাস্ট্রয়ে পর্যবেক্ষক পদ্ধতিগুলি)। ধ্বংস হওয়া বস্তুর সংগ্রহ ফিরিয়ে দেয়; প্রতিটি হিমশীতল হবে, প্রতিস্থাপন করতে যে কোনও পরিবর্তন করা উচিত নয় (যেহেতু সেগুলি স্থির করা যায় না)।
দ্রষ্টব্য: আপনি একবারে অনেকগুলি রেকর্ড মুছে ফেললে ইনস্ট্যান্টেশন, কলব্যাক এক্সিকিউশন এবং প্রতিটি রেকর্ড মুছে ফেলা সময় সাপেক্ষ হতে পারে। এটি রেকর্ড প্রতি কমপক্ষে একটি এসকিউএল ডিলিট ক্যোয়ারী উত্পন্ন করে (বা সম্ভবত আরও বেশি, আপনার কলব্যাকগুলি প্রয়োগ করতে)। আপনি যদি অনেকগুলি সারিগুলি তাদের সমিতি বা কলব্যাকের জন্য উদ্বেগ ছাড়াই দ্রুত মুছে ফেলতে চান তবে পরিবর্তে মুছুন_ সমস্তই ব্যবহার করুন।
মূলত "মুছুন" রেকর্ড মুছে ফেলার জন্য সরাসরি একটি ডাটাবেসে প্রেরণ পাঠায়। সেক্ষেত্রে রেলগুলি জানে না যে এটি মোছা হচ্ছে এমন রেকর্ডে কী কী বৈশিষ্ট্য রয়েছে বা না কোনও কলব্যাক রয়েছে (যেমন before_destroy
)।
"ধ্বংস" পদ্ধতিটি পাস করা আইডি নেয়, "ফাইন্ড" পদ্ধতিটি ব্যবহার করে ডাটাবেস থেকে মডেলটি নিয়ে আসে এবং তারপরে কলটিকে ডিল করে। এর অর্থ কলব্যাকগুলি ট্রিগার করা হয়েছে।
আপনি যদি কলব্যাকগুলি ট্রিগার করতে না চান বা আপনি আরও ভাল পারফরম্যান্স চান না তবে আপনি "মুছুন" ব্যবহার করতে চান। অন্যথায় (এবং বেশিরভাগ সময়) আপনি "ধ্বংস" ব্যবহার করতে চাইবেন।
ইতিমধ্যে প্রচুর উত্তর; আরও কিছুটা নিয়ে লাফিয়ে উঠতে চেয়েছিল
ডক্স :
Has_many এর জন্য, সর্বনাশ এবং ধ্বংস_ সবসময় রেকর্ড (গুলি) মুছে ফেলার ধ্বংস পদ্ধতি কল করবে যাতে কলব্যাকগুলি চালানো হয়। তবে মুছুন এবং মুছুন_ সমস্তই হয় নির্ভর করে: নির্ভরশীল বিকল্প দ্বারা সুনির্দিষ্ট কৌশল অনুসারে মুছে ফেলা হবে বা যদি না: নির্ভর বিকল্প দেওয়া হয়, তবে এটি ডিফল্ট কৌশল অনুসরণ করবে। ডিফল্ট কৌশলটি কিছুই না করা (পিতামহীন আইডি সেট সহ বিদেশী কীগুলি ছেড়ে দিন), has_many ব্যতীত: যেখানে ডিফল্ট কৌশলটি মুছে ফেলা হয় (তাদের কলব্যাকগুলি চালনা না করেই যোগদানের রেকর্ডগুলি মুছুন)।
delete
Verbage জন্য ভিন্নভাবে কাজ করে ActiveRecord::Association.has_many
এবং ActiveRecord::Base
। পরেরটির জন্য, মুছুন SQL DELETE
সমস্ত কার্যকরতা / কলব্যাকগুলি কার্যকর করে এবং বাইপাস করবে । সমিতিতে :dependent
পাস করা বিকল্পের ভিত্তিতে প্রাক্তনকে মৃত্যুদন্ড কার্যকর করা হবে । যাইহোক, পরীক্ষার সময়, আমি নিম্নলিখিত পার্শ্ব প্রতিক্রিয়া পেয়েছি যেখানে কলব্যাকগুলি কেবল চালানো হয়েছিল delete
এবং নাdelete_all
dependent: :destroy
উদাহরণ:
class Parent < ApplicationRecord
has_many :children,
before_remove: -> (_) { puts "before_remove callback" },
dependent: :destroy
end
class Child < ApplicationRecord
belongs_to :parent
before_destroy -> { puts "before_destroy callback" }
end
> child.delete # Ran without callbacks
Child Destroy (99.6ms) DELETE FROM "children" WHERE "children"."id" = $1 [["id", 21]]
> parent.children.delete(other_child) # Ran with callbacks
before_remove callback
before_destroy callback
Child Destroy (0.4ms) DELETE FROM "children" WHERE "children"."id" = $1 [["id", 22]]
> parent.children.delete_all # Ran without callbacks
Child Destroy (1.0ms) DELETE FROM "children" WHERE "children"."parent_id" = $1 [["parent_id", 1]]