আমি কি কারাগুলিতে ক্যাসকেড মোছা সেট আপ করতে পারি?


90

আমি জানি এটি সম্ভবত কোথাও ইন্টারনেটে রয়েছে তবে আমি স্ট্যাকওভারফ্লোতে উত্তরটি খুঁজে পাচ্ছি না তাই আমি ভেবেছিলাম যে আমি এখানে জ্ঞানের ভিত্তিটি কিছুটা বাড়িয়ে তুলতে পারি।

আমি রুবি এবং রেলসের একজন নবাগত কিন্তু আমার সংস্থা এতে বেশ বিনিয়োগ হচ্ছে তাই আমি আরও কিছুটা বিশদে এটি জানার চেষ্টা করছি।

ডাটাবেস থেকে বরং "মডেল" থেকে অ্যাপ্লিকেশন ডিজাইনিং করার ক্ষেত্রে আমার মানসিকতার পরিবর্তন করা আমার পক্ষে মুশকিল, সুতরাং আমি ডেটাবেসগুলিতে ক্লাসিক্যালি যে নকশার কাজটি করেছি তা কীভাবে করব তা জানার চেষ্টা করছি পরিবর্তে রেল মডেল।

সুতরাং আমি আমার দেওয়া সবচেয়ে সাম্প্রতিক কাজ হ'ল ক্যাসকেডিং মোছার জন্য কীভাবে একটি রেল ডাটাবেস মডেলটি কনফিগার করতে হয় তা নির্ধারণ করা? এটি করার কোনও সহজ উপায় আছে? বা আমার কি MySQL এ গিয়ে সেট আপ করতে হবে?

উত্তর:


105

আপনি: নির্ভরযোগ্য বিকল্প এতে: মুছে ফেলতে_ও সেট করতে পারেন। : মুছে ফেলা সমস্ত শিশুর রেকর্ড মুছতে একটি একক এসকিউএল বিবৃতি জারি করবে। এটি ব্যবহারের কারণে: মুছে ফেলা_আপনি আপনাকে আরও ভাল পারফরম্যান্স দিতে পারেন।

has_many :memberships, dependent: :delete_all

8
আপনার ব্যাখ্যা বিভ্রান্তিকর। একটি একক এসকিউএল বিবৃতি ব্যবহৃত হবে, তবে প্রতিটি সন্তানের সারির জন্য ধ্বংস পদ্ধতিটি কল করা হবে না। এর জন্য আপনাকে ডিস্টেল_ল ব্যবহার করতে হবে।
জন টপলি 20

@ জন - আশা করি সম্পাদনাগুলি বিভ্রান্তি দূর করবে। যে ইশারা জন্য ধন্যবাদ.
মাইক ব্রেন

27
আপনি এটি ব্যবহার :delete_allএবং এর মধ্যে পার্থক্য বুঝতে পেরেছেন তা নিশ্চিত করুন :destroy। উভয়ই বাচ্চার সদস্যতা (মুছে ফেলার [শ্রদ্ধাবোধের জন্য 1 স্তর) এবং nধ্বংসের জন্য (যদি তাদের বাচ্চারা নির্ভরশীল ধ্বংস করে থাকে) ডাটাবেস থেকে সরিয়ে :destroyফেলবে , তবে প্রতিটি সন্তানের অবজেক্টটি ইনস্ট্যান্ট করবে এবং কোনও কলব্যাক আগে চালাবে, যেখানে :delete_allসরাসরি একটি চালানো হবে ডাটাবেসে SQL বিবৃতি মুছে ফেলুন। :destroyএর কারণে ধীর, তবে এটি যখন রেকর্ড নষ্ট হয়ে যায় তখন আপনাকে কলব্যাক করতে দেয়। এক প্রান্তে রেলগুলি চালিত করা এবং অন্যদিকে সম্ভাব্য এন ^ x ইনস্ট্যান্টেশন।
jstim

4
আমি ডাটাবেস বিদেশী কী সেট আপ করার পরামর্শ দিই। এই পদ্ধতিতে রেকর্ডগুলি একটি অপারেশন দিয়ে মুছে ফেলা হয়। আমি পোস্ট করা নীচের উত্তর দেখুন।
হেনড্রিক

66

হ্যাঁ আপনি করতে পারেন, যদি আপনি has_many এর মতো সম্পর্ক ব্যবহার করেন তবে আপনি এটি করেন

has_many :memberships, dependent: :destroy

ড্যান, সুতরাং আমি আমার পরবর্তী প্রশ্নটি অনুমান করি যে আমি যদি একটি ডিবি মাইগ্রেট কমান্ড চালনা করি তবে তা আসলে ডিবিতে সেট আপ করবে? বা ক্যাসকেডিং পুরোপুরি রেল দ্বারা পরিচালিত হয়?
ম্যাট_দেব

হ্যাঁ, এটি রেল দ্বারা পরিচালিত হয়। (নিশ্চিত করুন যে আপনাকে অবশ্যই সর্বদা সম্পর্কিত প্রতিটি সারি মুছে ফেলতে হবে।)
স্টেইন জি স্ট্রিনডগ

@ ম্যাট - has_many লাইনটি আপনার মডেল শ্রেণিতে হওয়া উচিত, স্থানান্তরটি এটি আপনার জন্য যোগ করবে না।
গ্যারেথ

আমি এই সমাধানটি পছন্দ করি কারণ এটি নির্ভর করে যদি নির্ভরশীল মডেলটির সাথে আরও কিছু সম্পর্ক থাকে
tpei

27

প্রদত্ত উত্তরের বিপরীতে আমি এটি একটি ডেটাবেস স্তরেও করার পরামর্শ দিচ্ছি। আপনার যদি বিভিন্ন প্রক্রিয়া বা একাধিক থ্রেডযুক্ত পরিবেশ থাকে তবে এটি ঘটতে পারে যে রেকর্ডগুলি সঠিকভাবে মোছা হয়নি। তদ্ব্যতীত ডাটাবেস বিদেশী কী প্রচুর ডেটা মোছার সময় জিনিসগুলিকে দ্রুততর করে তোলে।

প্রস্তাবিত উত্তরের মতো এটি করুন:

has_many :memberships, dependent: :delete_all

তবে foreign_keyকোনও মাইগ্রেশনে সেটআপ করার বিষয়টি নিশ্চিত করুন । এইভাবে ডাটাবেস আপনার জন্য স্বয়ংক্রিয়ভাবে রেকর্ডগুলি মুছে ফেলার যত্ন নেয়।

কোনও সদস্যতা মোছার সময় মানগুলি বাতিল করার জন্য, ধরে নিবেন আপনার কাছে কোনও ব্যবহারকারীর মডেল রয়েছে:

add_foreign_key :users, :memberships, on_delete: :nullify

যখনই কোনও সদস্যতা মোছা হয় আপনি সমস্ত মডেল মুছতে পারেন

add_foreign_key :users, :memberships, on_delete: :cascade

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

4
এমনকি আপনাকে delete_allমডেলটিতে সেটআপ করার প্রয়োজন হবে না । বিদেশী কী আপনার জন্য ডেটাবেস স্তরে সবকিছু সঠিকভাবে মুছে ফেলার যত্ন নেবে।
হেন্ডরিক

4
আপনি দুজনেই যখন করবেন তখন কি হবে তা সম্পর্কে আমি কৌতূহল বোধ করি। দেখে মনে হচ্ছে এটির নেতিবাচক প্রভাব না থাকা উচিত তবে এআর এবং ডিবি উভয় স্তরের করার অনুশীলনের সাথে কারও খারাপ অভিজ্ঞতা হয়েছে?
জেমস ক্লিন

4
ডাটাবেস স্তরটি আমি যা খুঁজছিলাম looking এটি আমার মতে গ্রহণযোগ্য উত্তর হওয়া উচিত। অন্যরা মনে হয় তারা কেবলমাত্র যদি কাজ করে তবেই যদি আমার প্রশ্নগুলি স্ট্যান্ডার্ড অ্যাক্টিভেকর্ড অপারেশনগুলিতে আটকে থাকে।
ব্রেট বিটি

10

কেবল মনে রাখবেন যে মুছুন_সামান্য শিশু রেকর্ডে কোনও কলব্যাকগুলি (পূর্বের_ডাস্ট্রয় এবং পরে_ডাস্ট্রয়ের মতো) কার্যকর করবে না।


6

দেখে মনে হচ্ছে এই প্লাগইনটি আপনি যা সন্ধান করছেন তা আপনাকে দিতে পারে যদি আপনি প্রকৃত ডাটাবেস কাঠামোতে ক্যাসকেডিং মোছা প্রতিবিম্বিত করতে চান:

http://www.redhillonrails.org/fireign_key_migrations.html

মাইগ্রেশনে এটি ব্যবহারের জন্য ফর্ম্যাটটি এরকম কিছু হবে:

create_table :orders do |t|
  t.column :customer_id, :integer, :on_delete => :set_null, :on_update => :cascade
  ...
end

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