Ruby on Rails-এর ActiveRecord ORM (Object-Relational Mapping) একটি শক্তিশালী ডেটাবেস ম্যানিপুলেশন টুল যা বিভিন্ন ধরনের কুইরি অপারেশন সহজে সম্পাদন করতে সহায়তা করে। এর মধ্যে রয়েছে Advanced Query Techniques এবং Scopes, যা ডেটাবেসের বিভিন্ন রেকর্ড সহজে খুঁজে বের করার জন্য ব্যবহার করা হয়। এই দুটি বিষয় Rails অ্যাপ্লিকেশনকে আরো কার্যকরী এবং রিচ করতে সাহায্য করে।
Advanced Query Techniques
Rails-এ অ্যাডভান্সড কুইরি টেকনিক্স ব্যবহার করে জটিল ডেটাবেস কুইরি করা সম্ভব। এতে কিছু ডাইনামিক কুইরি এবং টেক্সট ম্যানিপুলেশন, অ্যাগ্রিগেট ফাংশন ইত্যাদি অন্তর্ভুক্ত থাকে।
1. where কন্ডিশন
where মেথড একটি কন্ডিশন তৈরি করে, যেটি নির্দিষ্ট শর্তে ডেটাবেস থেকে রেকর্ড নির্বাচন করতে ব্যবহৃত হয়। এটি কুইরি ফিল্টার করতে অত্যন্ত কার্যকরী।
# নির্দিষ্ট নামের ব্যবহারকারী খুঁজে বের করা
users = User.where(name: "John Doe")
# বয়সের ওপর শর্ত
users = User.where("age > ?", 18)
2. select মেথড
select মেথড ডেটাবেস থেকে শুধুমাত্র প্রয়োজনীয় কলামগুলো নির্বাচন করতে ব্যবহৃত হয়। এটি কুইরিকে আরও নির্দিষ্ট করে তোলে।
# শুধুমাত্র নাম এবং ইমেইল কলাম নির্বাচন
users = User.select(:name, :email)
3. find_by মেথড
find_by মেথড একটি রেকর্ড খুঁজে বের করতে ব্যবহৃত হয় যেখানে প্রথম মেলানো শর্তটি পাওয়া যায়। এটি ডাটা রিটার্ন করার সময় nil ফেরত দিতে পারে যদি শর্ত পূর্ণ না হয়।
# নামের ভিত্তিতে প্রথম মেলানো ব্যবহারকারী খুঁজে বের করা
user = User.find_by(name: "John Doe")
4. joins এবং includes মেথড
joins এবং includes মেথড ব্যবহার করে বিভিন্ন টেবিলের মধ্যে সম্পর্কযুক্ত রেকর্ডগুলো নির্বাচন করা হয়।
joins: ডাটাবেসে যোগ করা টেবিলগুলোর মধ্যে একটি INNER JOIN করতে ব্যবহৃত হয়।# পোষ্ট এবং কমেন্টের মধ্যে INNER JOIN posts = Post.joins(:comments).where("comments.created_at > ?", 1.week.ago)includes: এটি Eager Loading ব্যবহারের মাধ্যমে একটি সম্পর্কিত টেবিল থেকে সমস্ত রেকর্ড একসাথে লোড করে।# পোষ্ট এবং কমেন্ট Eager load করা posts = Post.includes(:comments).where("comments.created_at > ?", 1.week.ago)
5. group এবং having মেথড
group এবং having ব্যবহার করে অ্যাগ্রিগেট ফাংশন (যেমন COUNT, AVG) এর সাথে গ্রুপিং করা যায়।
# প্রতি বয়স অনুযায়ী ব্যবহারকারীদের সংখ্যা গণনা করা
users = User.group(:age).having("count(*) > ?", 5).count
Scopes
Scopes হল ActiveRecord মডেলে ব্যবহারকারীর কাস্টম কুইরি মেথড তৈরি করার একটি উপায়। এগুলি ডেটাবেস কুইরির পুনরায় ব্যবহারযোগ্য অংশ তৈরি করতে সহায়তা করে, যার ফলে কোড আরও পরিষ্কার এবং রি-ইউজেবল হয়।
1. Scope কী?
Rails-এ scope হল একটি ক্লাস মেথড যা একটি কাস্টম কুইরি সংজ্ঞায়িত করে এবং ActiveRecord রিকর্ডগুলোতে শর্ত প্রয়োগ করে। স্কোপগুলি মূলত কুইরি কন্ডিশনসমূহকে রি-ইউজ করার জন্য ব্যবহৃত হয়।
2. Scope তৈরি করা
Rails মডেলে scope ডিফাইন করা সহজ। scope সাধারণত একটি ব্লক আকারে লেখা হয়, যেখানে প্রথম আর্গুমেন্ট হলো স্কোপের নাম এবং দ্বিতীয় আর্গুমেন্ট হলো কুইরি।
class User < ApplicationRecord
# বয়স ১৮ বছরের বেশি এমন ব্যবহারকারীদের স্কোপ
scope :adults, -> { where("age >= ?", 18) }
# অ্যাকটিভ স্ট্যাটাসের ব্যবহারকারীদের স্কোপ
scope :active, -> { where(active: true) }
end
3. Scope ব্যবহার করা
স্কোপ ব্যবহার করতে হলে শুধু তার নাম কল করলেই হবে:
# ১৮ বছরের বেশি ব্যবহারকারীদের পাওয়া যাবে
adults = User.adults
# অ্যাকটিভ ব্যবহারকারীদের পাওয়া যাবে
active_users = User.active
4. একাধিক স্কোপ একসাথে ব্যবহার করা
একাধিক স্কোপকে একসাথে ব্যবহার করা যায়, এর ফলে কুইরি আরও নির্দিষ্ট এবং কার্যকরী হয়ে ওঠে।
# ১৮ বছরের বেশি এবং অ্যাকটিভ ব্যবহারকারীদের পাওয়া যাবে
adults_active = User.adults.active
5. নাম্বার কন্ডিশন ব্যবহার করে স্কোপ
স্কোপে গণনা বা শর্ত অনুযায়ী কুইরি করা যায়।
class Post < ApplicationRecord
# কমেন্টের সংখ্যা ১০ বা তার বেশি এমন পোস্ট স্কোপ
scope :popular, -> { where("comments_count >= ?", 10) }
end
6. ডিফল্ট স্কোপ (Default Scope)
Rails-এ আপনি একটি ডিফল্ট স্কোপও ব্যবহার করতে পারেন, যা সব কুইরির জন্য স্বয়ংক্রিয়ভাবে প্রয়োগ হয়। তবে, এটি সাবধানতার সাথে ব্যবহার করা উচিত কারণ এটি সব কুইরিতে প্রভাব ফেলবে।
class User < ApplicationRecord
# অ্যাকটিভ ব্যবহারকারীদের জন্য ডিফল্ট স্কোপ
default_scope { where(active: true) }
end
এখানে, User.all যদি কল করা হয়, তবে শুধু অ্যাকটিভ ব্যবহারকারীর রেকর্ডই ফিরে আসবে, যেহেতু এটি একটি ডিফল্ট স্কোপ।
সারমর্ম
Advanced Query Techniques এবং Scopes Rails অ্যাপ্লিকেশনে ডেটাবেস অপারেশনগুলিকে আরও গতিশীল এবং কার্যকরী করে তোলে। Advanced Query Techniques ব্যবহার করে আপনি ডেটাবেসের সাথে জটিল কুইরি অপারেশন করতে পারেন, যেমন joins, includes, এবং অ্যাগ্রিগেট ফাংশন। অন্যদিকে, Scopes ব্যবহার করে আপনি কাস্টম কুইরি ফিল্টারগুলো পুনরায় ব্যবহারযোগ্য করে তুলতে পারেন এবং মডেল ক্লাসে সহজে সংজ্ঞায়িত করতে পারেন। স্কোপগুলির মাধ্যমে ডেটাবেস কুইরি আরও সুসংগঠিত এবং পরিষ্কার থাকে, যা কোডের রি-ইউজেবিলিটি বাড়ায় এবং রক্ষণাবেক্ষণ সহজ করে।
Read more