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

রেইলস `where` মেথড মাস্টার করুন: প্র্যাক্টিক্যাল উদাহরণ ও বেস্ট প্র্যাকটিস

রেইলসে, আপনি আপনার মডেলের মাধ্যমে ডেটাবেস কোয়েরি করে আপনার ডেটা এক্সেস করতে পারেন।

আপনি এটা ActiveRecord মেথড ব্যবহার করে করতে পারেন।

যেমন where, find, বা find_by।

ফলস্বরূপ আপনি পাবেন:

  • find_by দিয়ে, একটি সিঙ্গেল রেকর্ড বা nil
  • where দিয়ে, একটি ActiveRecord::Relation অবজেক্ট
  • find দিয়ে, একটি সিঙ্গেল রেকর্ড, এর প্রাইমারি কলাম (সাধারণত id) দিয়ে খুঁজে পাওয়া, না পেলে এক্সেপশন রেইজ করে

অন্য কথায়:

আপনি যদি এক রেকর্ড এক্সপেক্ট করেন (এক নির্দিষ্ট ইউজার), find_by ব্যবহার করুন, একাধিক রেকর্ডের জন্য (ইউজার লিস্ট) where ব্যবহার করুন।

কিন্তু where-র অনেকভাবে ব্যবহার করা যায়, যা প্রায়শই বিগিনারদের বিভ্রান্ত করে।

কোন সমস্যা নেই!

আমরা আপনার রেইলস অ্যাপ্লিকেশনে where ব্যবহারের বিভিন্ন পদ্ধতি দেখব।

বেসিক Where কন্ডিশনস

where ব্যবহার করার উদ্দেশ্য হলো একটি ক্যোয়ারী বানানো যা আপনার ডেটাবেসের ইনফরমেশন ফিল্টার করে, যাতে আপনি শুধু আপনার পছন্দের রোগুলো পান।

উদাহরণ:

একটি Book মডেল দেওয়া, যাতে title, author এবং category রয়েছে।

আপনি কোন নির্দিষ্ট লেখকের সকল বই, অথবা কোন নির্দিষ্ট ক্যাটাগরির অধীনে পড়া সকল বই খুঁজতে চাইতে পারেন।

এখানে একটি ক্যোয়ারী:

Book.where(category: "Ruby")

এটি "Ruby" category যেসব বই সেগুলো রিটার্ন করে।

আপনি কন্ডিশনগুলো কম্বাইন ও করতে পারেন।

এভাবে:

Book.where(category: "Ruby", author: "Jesus Castello")

এটি category এবং author দুটোই ম্যাচ করে এমন বইগুলো রিটার্ন করে।

আপনি where কে একটি স্কোপসহ কম্বাইন করতে পারেন।

# scope definition
class Book
  scope :long_title, -> { where("LENGTH(title) > 20") }
end
# controller code
@books = Book.long_title.where(category: "Ruby")

একটি হ্যাশ (fruit: "apple") ব্যবহার করলে আপনি চেক করতে পারেন একটি কলাম কোন কিছুর সমান কিনা।

কিন্তু আপনি যদি সমানতা খুঁজছেন না? তবে আপনাকে একটি স্ট্রিং ব্যবহার করতে হবে।

রেইলস Where: Greater Than & Less Than

আপনি যদি "greater than", "less than", বা এরকম কিছু চেক করতে চান…

এভাবে করুন:

Book.where("LENGTH(title) > 20")

আপনি যদি ভ্যালু ইন্টারপোলেট করতে চান…

এভাবে করুন:

Book.where("LENGTH(title) > ?", params[:min_length])

এই ? কে একটি "প্লেসহোল্ডার" বলা হয়, এবং এটি "SQL injection" অ্যাটাক এড়াতে নিরাপত্তার জন্য ব্যবহৃত হয়।

আরেক অপশন হলো নেমড প্লেসহোল্ডার ব্যবহার করা।

উদাহরণ:

Book.where("LENGTH(title) > :min", min: params[:min_length])

আমি প্রশ্নচিহ্ন প্লেসহোল্ডারের চেয়ে এটিকে কমন পাই, কিন্তু অনেক ইন্টারপোলেটেড ভ্যালু ইনভলভ করা ক্যোয়ারীতে এটি উপকারী হতে পারে।

Where Not এবং Where Or কন্ডিশন কীভাবে ব্যবহার করবেন

আরো জটিল ক্যোয়ারী দেখি।

আপনি যদি চান একটি কন্ডিশন NOT true হোক, তবে আপনি where কে not মেথডসহ কম্বাইন করতে পারেন।

এখানে একটি উদাহরণ:

Book.where.not(category: "Java")

আরেক উদাহরণ:

Book.where.not(title: nil)

এটি title যেসব Book সেটি খুঁজে বের করে যেসব nil নয়।

OR কন্ডিশন কী?

আপনি where কে or মেথডসহ কম্বাইন করতে পারেন যাতে যেকোনো দুটি বা তার অধিক কন্ডিশন ম্যাচ করে এমন রোগুলো পাওয়া যায়।

এটি কীভাবে কাজ করে:

Book.where(category: "Programming").or(Book.where(category: "Ruby"))

এটি দুটি where ক্যোয়ারীকে একত্রিত করে।

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

রেইলস Where IN Array উদাহরণ

আমরা जितগুলো উদাহরণ দেখেছি সেগুলো একটি নির্দিষ্ট ভ্যালু খুঁজে।

কিন্তু আপনি একাধিক ভ্যালু খুঁজতে পারেন।

কীভাবে?

একটি অ্যারে ব্যবহার করে!

উদাহরণ:

Book.where(id: [1,2,3])

এটি একটি "IN" ক্যোয়ারী জেনারেট করে যা একসাথে এই সব আইডি সার্চ করবে।

SELECT "books".* FROM "books" WHERE "books"."id" IN (1, 2, 3)

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

রেইলস Joins অ্যাসোসিয়েশন কন্ডিশন

আপনি যদি একটি অ্যাসোসিয়েশন ভ্যালুর ওপর ভিত্তি করে ম্যাচ করতে চান, তবে আপনাকে joins মেথড দিয়ে সেই অ্যাসোসিয়েশন উপলব্ধ করতে হবে।

তারপর আপনি এইভাবে করতে পারেন:

Book.joins(:comments).where(comments: { id: 2 })

এই ক্যোয়ারী দিয়ে আপনি সকল বই পাবেন, যেগুলোর একটি কমেন্ট আছে, এবং সেই কমেন্টের id হলো 2।

স্ট্রিং ভার্সনের জন্য:

Book.joins(:comments).where("comments.id = 2")

যেখানে comments হলো টেবিল নাম, এবং id হলো কলাম নাম।

Where LIKE কন্ডিশন দিয়ে টেক্সটের ভিতরে সার্চ কীভাবে করবেন

আপনি যদি একটি সার্চ ফাংশন ইমপ্লিমেন্ট করতে চান, তবে আপনি পার্শিয়াল ম্যাচ আ্যালো করতে চাইতে পারেন।

আপনি এটা একটি "LIKE" ক্যোয়ারী দিয়ে করতে পারেন।

এখানে একটি উদাহরণ:

Book.where("title LIKE ?", "%" + params[:q] + "%")

এটি সকল টাইটেল খুঁজে বের করে যেগুলোর ভিতরে সার্চ টেক্সট (params[:q] দিয়ে প্রদত্ত) কোথাও আছে।

খুব সহায়ক ক্যোয়ারী!

পারসেন্ট সিম্বল কী?

SQL-এ, % একটি ওয়াইল্ডকার্ড ক্যারেক্টার।

ভিডিও: Where vs Find_By বিস্তারিত

সারসংক্ষেপ

আপনি রেইলস where মেথড ব্যবহার করে আপনার ActiveRecord মডেল ক্যোয়ারি করার পদ্ধতি শিখেছেন!

সহিত:

  • একাধিক কন্ডিশন দিয়ে ফিল্টার কীভাবে করবেন
  • অ্যারে ব্যবহার করে একাধিক রো দক্ষতার সাথে কীভাবে খুঁজবেন
  • or এবং not মেথডসহ where কম্বাইন করে আরও জটিল ক্যোয়ারী কীভাবে লিখবেন

এখন আপনার পালা এটি প্র্যাকটিসে আনার।

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

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

  2. রুবির grep মেথড মাস্টারিং: কোড উদাহরণসহ একটি ব্যবহারিক গাইড

  3. রুবির Map মেথড মাস্টারিং: উদাহরণসহ একটি ব্যবহারিক গাইড

  4. Linux Watch কমান্ড 습득: সিনট্যাক্স, অপশন এবং প্রয়োগিক উদাহরণ