সমস্যা ঘ
আসল উদাহরণটি বিবেচনা করি:
class Post < ActiveRecord::Base
default_scope { where(published: true) }
end
ডিফল্ট করার প্রেরণা published: true
, অপ্রকাশিত (প্রাইভেট) পোস্টগুলি দেখাতে চাইলে আপনাকে অবশ্যই প্রকাশিত হতে হবে তা নিশ্চিত করা হতে পারে। এ পর্যন্ত সব ঠিকই.
2.1.1 :001 > Post.all
Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE "posts"."published" = 't'
আচ্ছা এটি আমাদের প্রত্যাশা থেকে অনেক বেশি। এখন চেষ্টা করুন:
2.1.1 :004 > Post.new
=> #<Post id: nil, title: nil, published: true, created_at: nil, updated_at: nil>
এবং সেখানে আমাদের ডিফল্ট সুযোগ নিয়ে প্রথম বড় সমস্যা রয়েছে:
=> ডিফল্ট_স্কোপ আপনার মডেল প্রারম্ভিককরণকে প্রভাবিত করবে
যেমন একটি মডেল একটি নতুন নির্মিত উদাহরণে, default_scope
প্রতিফলিত হবে। সুতরাং আপনি সম্ভবত অপ্রকাশিত পোস্টগুলি তালিকাভুক্ত না করার বিষয়ে নিশ্চিত হতে চেয়েছিলেন, আপনি এখন পূর্বনির্ধারিত পোস্টগুলি তৈরি করছেন।
সমস্যা 2
আরও বিস্তৃত উদাহরণ বিবেচনা করুন:
class Post < ActiveRecord::Base
default_scope { where(published: true) }
belongs_to :user
end
class User < ActiveRecord::Base
has_many :posts
end
প্রথম ব্যবহারকারীদের পোস্ট পেতে দেয়:
2.1.1 :001 > User.first.posts
Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE "posts"."published" = 't' AND "posts"."user_id" = ? [["user_id", 1]]
এটি প্রত্যাশিত মনে হচ্ছে (ব্যবহারকারীর_আইডি সম্পর্কে অংশটি দেখতে ডানদিকে সমস্ত দিক থেকে স্ক্রোল করা নিশ্চিত করুন)।
এখন আমরা সমস্ত পোস্টের তালিকা পেতে চাই - অপ্রকাশিত অন্তর্ভুক্ত - লগ ইন করা ব্যবহারকারীর দর্শনের জন্য বলি। আপনি বুঝতে পারবেন আপনাকে 'ওভাররাইট' করতে হবে বা এর প্রভাবটি 'পূর্বাবস্থা' করতে হবে default_scope
। দ্রুত গুগলের পরে আপনি সম্ভবত এটি সম্পর্কে সন্ধান করবেন unscoped
। এরপরে কী ঘটে দেখুন:
2.1.1 :002 > User.first.posts.unscoped
Post Load (0.2ms) SELECT "posts".* FROM "posts"
=> আনসোপড করা সমস্ত স্কোপগুলি সরিয়ে দেয় যা সাধারণত আপনার নির্বাচনের ক্ষেত্রে অ্যাসোসিয়েশন সহ (তবে সীমাবদ্ধ নয়) সাধারণত প্রয়োগ হতে পারে।
এর বিভিন্ন প্রভাবগুলি ওভাররাইট করার একাধিক উপায় রয়েছে default_scope
। ডানটি পাওয়া খুব দ্রুত জটিল হয়ে যায় এবং আমি যুক্তি দিয়ে বলব যে default_scope
এটি প্রথম স্থানে ব্যবহার না করা একটি নিরাপদ পছন্দ হবে।