কম্পিউটার টিউটোরিয়াল

রুবি অন রেইলসে স্কোপস মাস্টার করুন: একটি প্র্যাক্টিক্যাল গাইড

রেইলসে স্কোপ কী এবং এটি কেন উপকারী?

হতে পারে আপনি ভাবছেন…

স্কোপ হল কাস্টম ক্যোয়ারী যা আপনি আপনার রেইলস মডেলের ভিতরে scope মেথড দিয়ে সংজ্ঞায়িত করেন।

প্রতিটি স্কোপ দুটি আর্গুমেন্ট নেয়:

  1. একটি নাম, যা আপনি আপনার কোডে এই স্কোপটি কল করতে ব্যবহার করেন।
  2. একটি ল্যাম্বডা, যা ক্যোয়ারীটি বাস্তবায়ন করে।

এটি এইরকম দেখে:

class Fruit < ApplicationRecord
  scope :with_juice, -> { where("juice > 0") }
end

একটি স্কোপ কল করার ফলস্বরূপ আপনাকে একটি ActiveRecord::Relation অবজেক্ট পাবেন।

অর্থাৎ আপনি স্কোপগুলো চেইন ও কম্বাইন করতে পারেন!

উদাহরণ:

Fruit.with_juice.with_round_shape.first(3)

এখন:

রেইলস স্কোপ সম্পর্কে আরও অনেক কিছু শিখতে বাকি, তাই এগিয়ে চলুন।

স্কোপ কখন ব্যবহার করবেন?

ঠিক আছে, স্কোপ কুল, কিন্তু কখন ব্যবহার করবেন?

একটি উদাহরণ দেখা যাক।

def index
  @books = Book.where("LENGTH(title) > 20")
end

এটি একটি index কন্ট্রোলার অ্যাকশন যা ২০ অক্ষরের চেয়ে বড় শিরোনামযুক্ত বইগুলো দেখাতে চায়।

এটি ঠিক আছে।

কিন্তু আপনি যদি এই ক্যোয়ারীটি অন্য জায়গায়ও ব্যবহার করতে চান, তবে ডুপ্লিকেট কোড লিখতে হবে।

ডুপ্লিকেট কোড আপনার প্রজেক্ট মেইনটেইন করা কঠিন করে দেয়।

চলুন এই ক্যোয়ারীটি একটি স্কোপে সরিয়ে ফেলি।

এভাবে:

class Book
  scope :with_long_title, -> { where("LENGTH(title) > 20") }
end

এখন আমাদের কন্ট্রোলার অ্যাকশন এইরকম দেখাবে:

def index
  @books = Book.with_long_title
end

বাড়তি সুন্দর!

আর্গুমেন্টসহ রেইলস স্কোপ কীভাবে ব্যবহার করবেন

আপনি একটি স্কোপে ভেরিয়েবল যোগ করতে চাইতে পারেন যাতে সেটি আরও ফ্লেক্সিবল হয়।

এখানে পদ্ধতিটি:

class Book
  scope :with_long_title, ->(length) { where("LENGTH(title) > ?", length) }
end

প্রশ্নচিহ্ন (?) হল একটি প্লেসহোল্ডার, যা length এর মান দ্বারা প্রতিস্থাপিত হবে। এটি আপনার কোডকে নিরাপদ করে।

আপনি যদি ডিফল্ট ভ্যালু চান:

class Book
  scope :with_long_title, ->(length = 20) { where("LENGTH(title) > ?", length) }
end

এবার ট্রাই করুন!

স্কোপ বনাম ক্লাস মেথড

স্কোপগুলো কিছু জাদুকরী বা সুপার স্পেশাল কাজ করে না।

তসচ্ছেদে, এগুলো শুধু মেথড।

বস্তুত… আপনি ক্লাস মেথড দিয়েও একই কাজ করতে পারেন!

যেমন:

class Fruit
  def self.with_juice
    where("juice > 0")
  end
end

কিন্তু স্কোপ ব্যবহার করার কিছু ডিজাইন সুবিধা আছে।

কারণ:

  • সিনট্যাক্সের কারণে স্কোপ ক্লিনার কোড ফলাফল দেয়
  • স্কোপ শুধু একটি কাজের জন্য ব্যবহৃত হয়, তাই দেখতেই বুঝতে পারবেন আপনি কী পাবেন
  • স্কোপ অন্যান্য মেথডের সাথে মিশো নয়, তাই সেগুলো খুব সহজে চিহ্নিত করা যায়

ফাংশনালিটি দৃষ্টিতে একমাত্র পার্থক্য হলো স্কোপ ActiveRecord::Relation গ্যারান্টি দেয়, কিন্তু ক্লাস মেথড দেয় না।

যখন আপনার স্কোপ কিছুই রিটার্ন না করে, তখন এটি আপনাকে এরর থেকে বাঁচায়।

ডিফল্ট স্কোপ ব্যবহার করবেন না

একটি ডিফল্ট স্কোপ হলো এমন একটি স্কোপ যা আপনার মডেলে স্বয়ংক্রিয়ভাবে প্রয়োগ হয়।

উদাহরণ:

class Post
  default_scope { where(published: true) }
end

হ্যাঁ! ডিফল্ট স্কোপগুলো খুব আকর্ষণীয়।

কিন্তু এগুলো প্রায়শই ভুল পছন্দ, কারণ আপনি ভুলে যাবেন যে আপনার এগুলো ডিফাইন করা আছে, অদ্ভুত এরর مواجه করবেন, এবং ডিবাগিংয়ে মূল্যবান সময় নষ্ট করবেন।

उसক সাথ…

আপনি যদি ডিফল্ট স্কোপের সাথে কাজ করতে বাধ্য হন, তবে বর্তমানে প্রয়োগ করা সকল স্কোপ নিষ্ক্রিয় করতে unscoped মেথড ব্যবহার করতে হতে পারে।

ভিডিও টিউটোরিয়াল দেখুন

সারসংক্ষেপ

খুব ভালো! এই আর্টিকেল পড়ার ফলে আপনি রেইলস স্কোপকে সবচেয়ে কার্যকরভাবে ব্যবহার করার পদ্ধতি শিখেছেন।

এই নতুন জ্ঞানকে প্র্যাক্টিসে আনার মাধ্যমে মনে রাখবেন কীভাবে কাজ করে।

পড়ার জন্য ধন্যবাদ। 🙂

  1. রুবি ম্যাট্রিক্স বুঝতে: ডেফিনিশন, অ্যাপ্লিকেশন এবং কীভাবে তৈরি করবেন

  2. রুবি মাস্টারিং: মেথড এলিয়াস তৈরি করার জন্য Alias কিওয়ার্ড ব্যবহার

  3. রুবি Struct ও OpenStruct: দক্ষ ভ্যালু অবজেক্টস

  4. রেইলসে OmniAuth-Twitter দিয়ে টুইটার লগইন ইন্টিগ্রেট করুন: ধাপে ধাপে গাইড