এই নিবন্ধটি কোরিয়ান ভাষায়ও উপলব্ধ, ধন্যবাদ Soonsang Hong!
স্কোপগুলি আপনার ডাটাবেস থেকে সঠিক বস্তুগুলি দখল করার একটি দুর্দান্ত উপায়:
class Review < ActiveRecord::Base
scope :most_recent, -> (limit) { order("created_at desc").limit(limit) }
end
আপনি এই মত সুযোগ ব্যবহার করবেন:
@recent_reviews = Review.most_recent(5)
যদিও, সেই সুযোগটিকে কল করা ঠিক দেখায় যেমন Review
-এ ক্লাস পদ্ধতিতে কল করা . এবং এটিকে একটি ক্লাস পদ্ধতি হিসাবে তৈরি করা সহজ, পরিবর্তে:
def self.most_recent(limit)
order("created_at desc").limit(limit)
end
@recent_reviews = Review.most_recent(5)
তাহলে কেন আপনি একটি সুযোগ ব্যবহার করবেন যখন আপনি নিয়মিত রুবি ক্লাস পদ্ধতি ব্যবহার করতে পারেন? আপনার মাথায় এইগুলি সম্পূর্ণ আলাদা, কিন্তু সমতুল্য, ধারণা রাখা কি মূল্যবান? যদি আপনি অদ্ভুত বাগ মধ্যে চালান? এই সমস্ত অতিরিক্ত জিনিস কি এমন জিনিস নয় যা রেলকে শেখা কঠিন করে তোলে?
কখন হবে একটি শ্রেণী পদ্ধতির পরিবর্তে একটি সুযোগ ব্যবহার করা মানে?
আমাদের কাছে ইতিমধ্যেই ক্লাস পদ্ধতি থাকলে স্কোপ ব্যবহার করব কেন?
যদি আপনি একটি নির্দিষ্ট তারিখের পরে লিখিত সমস্ত পর্যালোচনা দখল করতে চান? কিন্তু যদি কোনো তারিখ নির্দিষ্ট করা না থাকে, আপনি সমস্ত চেয়েছিলেন এর পরিবর্তে রিভিউ ফিরে এসেছে?
একটি সুযোগ হিসাবে, এটি এই মত দেখায়:
scope :created_since, ->(time) { where("reviews.created_at > ?", time) if time.present? }
যথেষ্ট সহজ, তাই না? ক্লাস পদ্ধতি সম্পর্কে কি?
def self.created_since(time)
if time.present?
where("reviews.created_at > ?", time)
else
all
end
end
একটু বাড়তি কাজ লাগে। স্কোপগুলি স্কোপগুলি ফেরত দিতে পছন্দ করে, তাই তাদের একসাথে চেইন করা সহজ:
Review.positive.created_since(5.days.ago)
কিন্তু ক্লাস পদ্ধতিটি একইভাবে কাজ করার জন্য, আপনাকে বিশেষভাবে সেই ক্ষেত্রে পরিচালনা করতে হবে যেখানে সময় নেই৷ অন্যথায়, কলার এটির একটি বৈধ, চেইনযোগ্য সুযোগ আছে কিনা তা বের করতে হবে।
যে পদ্ধতিগুলি সর্বদা একই ধরণের বস্তু ফেরত দেয় তা সত্যিই দরকারী . এজ কেস বা ত্রুটিগুলি সম্পর্কে আপনাকে ততটা চিন্তা করতে হবে না। আপনি ধরে নিতে পারেন যে আপনি ব্যবহার করতে পারেন এমন একটি বস্তু আপনাকে সর্বদা হস্তান্তর করা হবে।
এখানে, এর মানে হল আপনি nil
নিয়ে চিন্তা না করেই স্কোপগুলিকে একসাথে চেইন করতে পারেন মান ফিরে আসছে।
এখনও এমন কিছু উপায় আছে যা আপনি অনুমান ভাঙতে পারেন যে আপনি সর্বদা একটি সুযোগ ফিরে পাবেন:
scope :broken, -> { "Hello!!!" }
irb(main):001:0> Review.broken.most_recent(5)
NoMethodError: undefined method `most_recent' for "Hello!!!":String
কিন্তু বাস্তব কোডে এমনটা আমার কখনো হয়নি।
স্কপ সম্পর্কে আমি যে জিনিসটি সবচেয়ে বেশি পছন্দ করি তা হল তারা ইন্টেন্ট প্রকাশ করে . আপনি পরবর্তী ব্যক্তিকে বলছেন যে আপনার কোডটি পড়বে, "এই পদ্ধতিটি শৃঙ্খলিত হতে পারে, অবশেষে বস্তুর একটি তালিকায় পরিণত হবে এবং আপনাকে বস্তুর সঠিক সেট নির্বাচন করতে সহায়তা করবে।" এটি একটি সাধারণ ক্লাস পদ্ধতির চেয়ে অনেক বেশি।
কোন স্কোপের পরিবর্তে আপনার ক্লাস পদ্ধতি ব্যবহার করা উচিত?
কারণ স্কোপগুলি অভিপ্রায় প্রকাশ করে, আমি যখনই সাধারণ, অন্তর্নির্মিত স্কোপগুলি চেইন করি তখন আমি সেগুলি ব্যবহার করি (যেমন where
এবং limit
) আরো জটিল সুযোগে . বস্তুর সঠিক গুচ্ছ খোঁজার জন্য স্কোপ ডিজাইন করা হয়েছিল।
দুটি ব্যতিক্রম আছে:
- যখন আমার স্কোপগুলি প্রিলোড করার প্রয়োজন হয়, তখন আমি সেগুলিকে অ্যাসোসিয়েশনে পরিণত করি .
- যখন আমি বৃহত্তর স্কোপে চেইন বিল্ট-ইন স্কোপের চেয়ে বেশি করি, তখন আমি ক্লাস পদ্ধতি ব্যবহার করি .
যখন আপনার স্কোপ লজিক জটিল হয়ে যায়, তখন একটি ক্লাস পদ্ধতি এটি রাখার জন্য সঠিক জায়গা বলে মনে হয়।
একটি ক্লাস পদ্ধতির ভিতরে, আপনি সহজেই ডাটাবেস কোডের সাথে রুবি কোড মিশ্রিত করতে পারেন। আপনার কাছে যদি রুবিতে লেখার জন্য সহজতর সাজানোর কোড থাকে, তাহলে আপনি আপনার বস্তুগুলিকে তাদের ডিফল্ট ক্রমে ধরতে পারেন এবং সেগুলিকে সঠিক ক্রমে রাখতে sort_by ব্যবহার করতে পারেন৷
অথবা, আপনি যদি বিশেষভাবে জটিল বোধ করেন তবে একটি ক্লাস পদ্ধতি কয়েকটি ভিন্ন জায়গা থেকে ডেটা সংগ্রহ করতে পারে:আপনার ডাটাবেস, রেডিস, বা একটি বহিরাগত API বা পরিষেবা। তারপর, এটি অনুভূতি বস্তুর একটি সংগ্রহে এটিকে একত্রিত করতে পারে একটি সুযোগের মতো যা একটি অ্যারেতে পরিণত হয়েছে৷
৷তারপরও, আপনার নির্বাচন, বাছাই, যোগদান এবং ফিল্টারিং কোডগুলিকে স্কোপের মধ্যে রাখা ভাল। তারপর, আপনার ক্লাস পদ্ধতির ভিতরে আপনার সুযোগগুলি ব্যবহার করুন৷৷ আপনি একটি পরিষ্কার ক্লাস পদ্ধতি এবং আপনার অ্যাপ জুড়ে ব্যবহার করতে পারেন এমন সুযোগের সাথে শেষ হবে।
স্কোপগুলি আমার প্রিয় রেল বৈশিষ্ট্যগুলির মধ্যে একটি। আপনি কিছু শক্তিশালী জিনিস করতে পারেন - বিশেষ করে দরকারী সুযোগ উদাহরণ দেখতে রেল মডেলগুলিকে সাজানো এবং ফিল্টার করার বিষয়ে আমার নিবন্ধটি পড়ুন৷
এবং স্কোপ ব্যবহার করে আয়ত্ত করার একটি সত্যিই সহজ উপায় রয়েছে:ছোট, ফোকাসড অ্যাপের মধ্যে তাদের সাথে খেলুন। প্র্যাকটিসিং রেলের বিনামূল্যের নমুনা অধ্যায় আপনাকে দেখাবে কিভাবে। এটি পরীক্ষা করে দেখুন!