কম্পিউটার

রেলে রুবিতে কীভাবে স্কোপ ব্যবহার করবেন

রেলে সুযোগ কী এবং কেন এটি দরকারী?

ভাল…

স্কোপগুলি হল কাস্টম প্রশ্ন যা আপনি 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 কন্ট্রোলার অ্যাকশন যা 20টি অক্ষরের বেশি টাইটেল সহ বই প্রদর্শন করতে চায়।

এটা ঠিক আছে।

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

সদৃশ কোড আপনার প্রকল্প বজায় রাখা কঠিন করে তোলে।

আসুন এই ক্যোয়ারীটিকে একটি সুযোগে নিয়ে যাই।

এরকম :

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. রুবি আলিয়াস কীওয়ার্ড কীভাবে ব্যবহার করবেন

  3. রুবিতে স্ট্রাকট এবং ওপেনস্ট্রাক্ট কীভাবে ব্যবহার করবেন

  4. কিভাবে একটি রেল অ্যাপ্লিকেশনে OmniAuth-Twitter ব্যবহার করবেন