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


192

রেল গাইডগুলিতে এটি এর মতো বর্ণিত হয়েছে:

যদি তারা সম্পর্কিত হয় তবে তাদের যুক্ত করা হবে :dependent => :destroyএবং সেগুলির সাথে যুক্ত থাকলে মুছে ফেলা হবে:dependent => :delete_all

ঠিক আছে, দুর্দান্ত তবে ধ্বংস হওয়া এবং মুছে ফেলার মধ্যে পার্থক্য কী? আমি উভয় চেষ্টা করেছিলাম এবং এটি একই জিনিস বলে মনে হচ্ছে।

উত্তর:


200

পার্থক্যটি কলব্যাকের সাথে।

:delete_allসরাসরি আপনার আবেদন তৈরি এবং এসকিউএল দ্বারা মুছে ফেলে হয়:

DELETE * FROM users where compagny_id = XXXX

এর সাথে :destroy, আপনার সমস্ত বাচ্চাদের একটি ইনস্ট্যান্টেশন রয়েছে। সুতরাং, আপনি যদি এটি ধ্বংস করতে না পারেন বা প্রত্যেকের নিজস্ব থাকে তবে :dependentএর কলব্যাকগুলি কল করা যেতে পারে।


83
আপনার প্রচুর বাচ্চা থাকলে (এবং n ^ 2 যদি আপনার নাতি-নাতনি থাকে এবং আরও কিছু থাকে) বাচ্চাদের প্রতিটি বস্তুর উপর ইনস্ট্যান্টেশন এবং ধ্বংসের ডাকটি ধীর হয়ে যাবে। মুছে ফেলা সমস্ত হ'ল "কক্ষপথ থেকে এটি অনুগ্রহ করুন" সমাধানের এক ধরণের সমাধান যেখানে আপনি মডেলগুলিতে কলব্যাকগুলি ধ্বংস করার আগে / পরে কোনও যত্ন নেবেন না / নেই।
রায়ান বিগ

131

একটি রেলস মডেল সমিতিতে আপনি :dependentবিকল্পটি নির্দিষ্ট করতে পারেন , যা নিম্নলিখিত তিনটি ফর্মের মধ্যে একটি নিতে পারে:

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

2
দেখুন api.rubyonrails.org/classes/ActiveRecord/Associations/... প্রামাণিক rdocs জন্য ( "খর্ব" এর জন্য অনুসন্ধান)।
মিআরএম

21
যেহেতু রেল 3.0.০ এটি নির্দিষ্ট করাও সম্ভব :restrictযদি সেট করা থাকে: সীমাবদ্ধ যদি এই অবজেক্টটির কোনও সম্পর্কিত অবজেক্ট থাকে তবে মোছা যাবে না।
রকেটআর

17
এর চেহারা অনুসারে কোন বিকল্প :deleteবা :destroy_allবিকল্প নেই ? : নির্ভরশীল বিকল্পটি প্রত্যাশা করে: ধ্বংস,: মুছে ফেলুন: সমস্ত বাতিল করুন: বা বাতিল করুন: (নিষিদ্ধ)
মাইক ক্যাম্পবেল

2
@ মাইক ক্যাম্পবেল, :deleteএবং :destroy_allবিকল্পগুলি বিদ্যমান নেই। তবে, মডেলগুলিতে ক্লাস পদ্ধতি রয়েছে যা বলা হয় deleteএবং destroy_allতাই এটি বিভ্রান্তির কারণ হতে পারে।
বেরেজভস্কিই

@ মাইক ক্যাম্পবেল আপনি আরও কয়েকটি অপশন মিস করছেন, দেখুন: নির্ভরশীল বিকল্পটি অবশ্যই একটি হতে হবে [: ধ্বংস,: মুছে ফেলুন: সমস্ত বাতিল করুন: নিষিদ্ধ করুন: সীমাবদ্ধ_উইথ_অ্যাক্সেস]
প্রবীন মিশ্র

30

দেখুন মোছাগুলিকে ধ্বংস এর সাথে সংশ্লিষ্ট অন্যান্য উপাদানের যেখানে delete_all স্ব টেবিল থেকে একাধিক ডেটা মুছে দিতে পারেন যেমনDELETE * FROM table where field = 'xyz'

: নির্ভরশীল সম্ভাব্য বিকল্পগুলি:

সম্পর্কিত মালিকদের ধ্বংস হয়ে গেলে কী ঘটে তা নিয়ন্ত্রণ করে। দ্রষ্টব্য যে এগুলি কলব্যাক হিসাবে প্রয়োগ করা হয় এবং ব্যাকগুলি কলব্যাকগুলি যথাযথভাবে কার্যকর করে। সুতরাং, অন্যান্য অনুরূপ কলব্যাকগুলি প্রভাবিত করতে পারে: নির্ভরশীল আচরণ এবং :dependentআচরণটি অন্যান্য কলব্যাকগুলিকে প্রভাবিত করতে পারে।

:destroy এর সাথে সম্পর্কিত সমস্ত বস্তুও ধ্বংস হয়ে যায়।

:delete_all সম্পর্কিত সমস্ত বিষয়বস্তু সরাসরি ডাটাবেস থেকে মুছে ফেলার কারণ (যাতে কলব্যাকগুলি কার্যকর করা হবে না)।

:nullifyবিদেশী কীগুলি NULL এ সেট করতে দেয়। কলব্যাকগুলি কার্যকর করা হয় না।

:restrict_with_exception যদি কোনও সম্পর্কিত রেকর্ড থাকে তবে একটি ব্যতিক্রম উত্থাপিত হয়।

:restrict_with_error কোনও সম্পর্কিত যুক্ত বস্তু থাকলে মালিককে ত্রুটি যুক্ত করার কারণ ঘটায়।

:throughবিকল্পটি ব্যবহার করা হলে , যোগদানের মডেলটির সংযুক্তি অবশ্যই একটি স্বত্বাধিকারী হতে হবে এবং যে রেকর্ডগুলি মুছে ফেলা হবে এটি যুক্ত রেকর্ডের পরিবর্তে যোগদানের রেকর্ড।


3

প্রকৃতপক্ষে মূল পার্থক্যটি হ'ল যে কোনও কলব্যাক :delete_allব্যবহার করার সময় ডাকা হবে না । কিন্তু যখন :destroyকলব্যাকস স্ট্যাক ব্যবহার করা হবে ( :after_destroy, :after_commit...) তখন বরখাস্ত করা হবে।

ফলস্বরূপ, যদি আপনার touch:মোডে মুছে ফেলা মোডে ঘোষণা থাকে তবে তার চেয়ে dependent: :delete_allবরং 'নির্ভরশীল:: ধ্বংস' ব্যবহার করা ভাল ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.