ধ্বংস এবং মুছে ফেলার মধ্যে পার্থক্য


210

পার্থক্য কি

@model.destroy এবং @model.delete

উদাহরণ স্বরূপ:

Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all

আমি যদি একটি বা অন্যটি ব্যবহার করি তবে তা কি সত্যিই গুরুত্বপূর্ণ?

উত্তর:


289

মূলত destroyমডেলটিতে কোনও কলব্যাক চালায়delete না।

থেকে পাগল এপিআই :

  • ActiveRecord::Persistence.delete

    ডাটাবেসে রেকর্ড মুছে ফেলে এবং এই পরিবর্তনটি প্রতিবিম্বিত করে যে কোনও পরিবর্তন করা উচিত নয় (যেহেতু সেগুলি ধরে রাখা যায় না)। হিমায়িত দৃষ্টান্তটি প্রদান করে।

    রেকর্ডের প্রাথমিক কীতে একটি এসকিউএল মোছার বিবৃতি দিয়ে সারিটি সরানো হয় এবং কোনও কলব্যাক কার্যকর করা হয় না।

    অবজেক্টের পূর্বের_ডাস্ট্রয় এবং পরে_ডাস্ট্রয়ে কলব্যাকস বা যে কোনও প্রয়োগ করতে: নির্ভরশীল সমিতি বিকল্পগুলি, # ডস্ট্রোয় ব্যবহার করুন।

  • ActiveRecord::Persistence.destroy

    ডাটাবেসে রেকর্ড মুছে ফেলে এবং এই পরিবর্তনটি প্রতিবিম্বিত করে যে কোনও পরিবর্তন করা উচিত নয় (যেহেতু সেগুলি ধরে রাখা যায় না)।

    ধ্বংসের সাথে যুক্ত রয়েছে একটি সিরিজ কলব্যাক। পূর্ব_ডাস্ট্রয় কলব্যাক মিথ্যা হলে অ্যাকশন বাতিল হয়ে যায় এবং মিথ্যা রিটার্নস ধ্বংস করে দেয়। অ্যাক্টিভেকর্ড :: আরও তথ্যের জন্য কলব্যাকগুলি দেখুন।


হ্যালো @ user740584 - আপনার উত্তরের জন্য ধন্যবাদ। "মডেলটিতে কোনও কলব্যাক চালায়" বলতে কী বোঝ?
বিকেএসপুরজন

3
@ বি কে এসপুরজেন তার অর্থ অ্যাক্টিভেকর্ড :: কলব্যাকস : api.rubyonrails.org/classes/AtivetiveRecord/Callbacks.html । এই জাতীয় একটি কলব্যাক model#before_destroyযা destroy()নির্দিষ্ট শর্তে চূড়ান্ত কলটি থামাতে ব্যবহার করা যেতে পারে ।
টড

102

delete কেবলমাত্র ডিবি থেকে বর্তমান অবজেক্ট রেকর্ড মুছে ফেলবে তবে ডিবি থেকে এর সম্পর্কিত শিশুদের রেকর্ড নয়।

destroy ডিবি থেকে বর্তমান অবজেক্ট রেকর্ড এবং ডিবি থেকে এর সম্পর্কিত শিশুদের রেকর্ড মুছবে।

তাদের ব্যবহার সত্যিই গুরুত্বপূর্ণ:

যদি আপনার একাধিক অভিভাবক অবজেক্টগুলি সাধারণ শিশুদের অবজেক্টগুলিকে ভাগ destroyকরে দেয় তবে নির্দিষ্ট প্যারেন্ট অবজেক্টে কল করা বাচ্চাদের অবজেক্টগুলি মুছে ফেলবে যা অন্যান্য একাধিক পিতামাতার মধ্যে ভাগ করা আছে।


5
উজ্জ্বল উত্তর। ধন্যবাদ. আমি যুক্ত করব যে পরিভাষাটি আমি বুঝতে পেরেছি তা হ'ল বাচ্চাদের "হত্যা করা হয়েছে"। পাশবিক শিশু হত্যা।
বিকেএসপুরজন 10:25

উত্পাদনের বেশিরভাগ ক্ষেত্রে আপনি 'ধ্বংস' ব্যবহার করতে চান
বাইরের দিকে_বক্স ২

না এটি প্রয়োজনীয় নয়।
তাইমুর চাঙ্গাইজ

আমি মনে করি শব্দ তোমার জন্য ব্যবহার করা উচিত destroyনয় উত্তরপুরূষ , না শিশু : ডকুমেন্টেশন, ধ্বংস অনুযায়ী "বৈশিষ্ট্যাবলী থেকে একটি নতুন বস্তু তৈরি করে এবং পরে কল এটা ধ্বংস।" রুবডোক.ইন.ফো
মার্কো

12

আপনি যখন অনুরোধ করেন destroyবা destroy_allকোনও ActiveRecordঅবজেক্টে, ActiveRecord'ধ্বংস' প্রক্রিয়া শুরু করা হয়, এটি আপনি মুছে ফেলছেন এমন শ্রেণীর বিশ্লেষণ করে, এটি নির্ভর করে যে কী করা উচিত তা নির্ধারণ করে, বৈধতার মাধ্যমে চালিত হয় ইত্যাদি

আপনি যখন অনুরোধ করেন deleteবা delete_allকোনও অবজেক্টে, ActiveRecordকেবল ডিবিটির DELETE FROM tablename WHERE conditionsবিরুদ্ধে কোয়েরিটি চালানোর চেষ্টা করেন, অন্য কোনও ActiveRecordস্তরের কোনও কার্য সম্পাদন করে না ।


4

হ্যাঁ দুটি পদ্ধতির মধ্যে একটি প্রধান পার্থক্য রয়েছে আপনি যদি মডেল কলব্যাকগুলি কল না করে দ্রুত রেকর্ডগুলি মুছতে চান তবে মুছুন_এলটি ব্যবহার করুন

আপনি যদি আপনার মডেল কলব্যাকগুলি সম্পর্কে যত্নশীল হন তবে ডাস্টন_ল ব্যবহার করুন

অফিসিয়াল ডক্স থেকে

http://apidock.com/rails/ActiveRecord/Base/destroy_all/class

नष्ट করা সমস্ত (শর্তাবলী = শূন্য) সর্বজনীন

প্রতিটি রেকর্ড তাত্ক্ষণিকভাবে এবং এর ধ্বংস পদ্ধতিতে কল করে রেকর্ডের সাথে মেলে শর্তগুলি ধ্বংস করে। প্রতিটি বস্তুর কলব্যাকগুলি কার্যকর করা হয় (সহ: নির্ভরশীল সমিতি বিকল্পগুলি এবং পূর্ববর্তী_ডেসট্রয় / আফটার_ডাস্ট্রয়ে পর্যবেক্ষক পদ্ধতিগুলি)। ধ্বংস হওয়া বস্তুর সংগ্রহ ফিরিয়ে দেয়; প্রতিটি হিমশীতল হবে, প্রতিস্থাপন করতে যে কোনও পরিবর্তন করা উচিত নয় (যেহেতু সেগুলি স্থির করা যায় না)।

দ্রষ্টব্য: আপনি একবারে অনেকগুলি রেকর্ড মুছে ফেললে ইনস্ট্যান্টেশন, কলব্যাক এক্সিকিউশন এবং প্রতিটি রেকর্ড মুছে ফেলা সময় সাপেক্ষ হতে পারে। এটি রেকর্ড প্রতি কমপক্ষে একটি এসকিউএল ডিলিট ক্যোয়ারী উত্পন্ন করে (বা সম্ভবত আরও বেশি, আপনার কলব্যাকগুলি প্রয়োগ করতে)। আপনি যদি অনেকগুলি সারিগুলি তাদের সমিতি বা কলব্যাকের জন্য উদ্বেগ ছাড়াই দ্রুত মুছে ফেলতে চান তবে পরিবর্তে মুছুন_ সমস্তই ব্যবহার করুন।


2

মূলত "মুছুন" রেকর্ড মুছে ফেলার জন্য সরাসরি একটি ডাটাবেসে প্রেরণ পাঠায়। সেক্ষেত্রে রেলগুলি জানে না যে এটি মোছা হচ্ছে এমন রেকর্ডে কী কী বৈশিষ্ট্য রয়েছে বা না কোনও কলব্যাক রয়েছে (যেমন before_destroy)।

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

আপনি যদি কলব্যাকগুলি ট্রিগার করতে না চান বা আপনি আরও ভাল পারফরম্যান্স চান না তবে আপনি "মুছুন" ব্যবহার করতে চান। অন্যথায় (এবং বেশিরভাগ সময়) আপনি "ধ্বংস" ব্যবহার করতে চাইবেন।


2

ইতিমধ্যে প্রচুর উত্তর; আরও কিছুটা নিয়ে লাফিয়ে উঠতে চেয়েছিল

ডক্স :

Has_many এর জন্য, সর্বনাশ এবং ধ্বংস_ সবসময় রেকর্ড (গুলি) মুছে ফেলার ধ্বংস পদ্ধতি কল করবে যাতে কলব্যাকগুলি চালানো হয়। তবে মুছুন এবং মুছুন_ সমস্তই হয় নির্ভর করে: নির্ভরশীল বিকল্প দ্বারা সুনির্দিষ্ট কৌশল অনুসারে মুছে ফেলা হবে বা যদি না: নির্ভর বিকল্প দেওয়া হয়, তবে এটি ডিফল্ট কৌশল অনুসরণ করবে। ডিফল্ট কৌশলটি কিছুই না করা (পিতামহীন আইডি সেট সহ বিদেশী কীগুলি ছেড়ে দিন), has_many ব্যতীত: যেখানে ডিফল্ট কৌশলটি মুছে ফেলা হয় (তাদের কলব্যাকগুলি চালনা না করেই যোগদানের রেকর্ডগুলি মুছুন)।

deleteVerbage জন্য ভিন্নভাবে কাজ করে 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]]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.