ใน Rails คุณสามารถสืบค้นฐานข้อมูลผ่านโมเดลของคุณเพื่อเข้าถึงข้อมูลของคุณ
คุณสามารถทำได้โดยใช้ ActiveRecord
วิธีการ
ชอบ where
, find
, หรือ find_by
.
ส่งผลให้คุณได้รับ :
- ด้วย
find_by
, ระเบียนเดียวหรือnil
- ด้วย
where
,ActiveRecord::Relation
วัตถุ - ด้วย
find
เป็นระเบียนเดียวที่พบโดยคอลัมน์หลัก (โดยปกติคือid
) ทำให้เกิดข้อยกเว้นหากไม่พบ
กล่าวอีกนัยหนึ่ง :
หากคุณต้องการบันทึกหนึ่งรายการ (ผู้ใช้เฉพาะ) ให้ใช้ find_by
สำหรับหลายระเบียน (รายชื่อผู้ใช้) ให้ใช้ where
.
แต่ where
มีหลายวิธีในการใช้งาน ซึ่งมักจะสร้างความสับสนให้กับผู้เริ่มต้น
ไม่มีปัญหา!
เราจะมาดูวิธีต่างๆ ที่คุณสามารถใช้ where
ในแอปพลิเคชัน Rails ของคุณ
พื้นฐานที่เงื่อนไข
วัตถุประสงค์ของการใช้ where
คือการสร้างแบบสอบถามที่กรองข้อมูลในฐานข้อมูลของคุณ ดังนั้นคุณจะได้เฉพาะแถวที่คุณต้องการ
ตัวอย่างเช่น :
ได้รับ Book
รุ่นที่มี title
, author
&category
.
คุณอาจต้องการค้นหาหนังสือทั้งหมดโดยผู้แต่งคนใดคนหนึ่ง หรือหนังสือทั้งหมดที่จัดอยู่ในหมวดหมู่เฉพาะ
นี่คือข้อความค้นหา :
Book.where(category: "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"
) ให้คุณตรวจสอบว่าคอลัมน์มีค่าเท่ากับบางสิ่งหรือไม่
แต่ถ้าคุณไม่ได้มองหาความเท่าเทียมกันล่ะ
จากนั้นคุณจะต้องใช้สตริง
รางที่ไหน:มากกว่า &น้อยกว่า
หากคุณต้องการตรวจสอบคำว่า “มากกว่า” “น้อยกว่า” หรืออะไรทำนองนั้น…
ทำแบบนี้ :
Book.where("LENGTH(title) > 20")
หากคุณต้องการสอดแทรกค่า…
ทำแบบนี้ :
Book.where("LENGTH(title) > ?", params[:min_length])
?
เรียกว่า "ตัวยึดตำแหน่ง" และใช้เพื่อความปลอดภัยเพื่อหลีกเลี่ยงการโจมตี "การฉีด SQL"
อีกทางเลือกหนึ่งคือการใช้ตัวยึดตำแหน่งที่มีชื่อ
ตัวอย่าง :
Book.where("LENGTH(title) > :min", min: params[:min_length])
ฉันพบว่าสิ่งนี้ใช้น้อยกว่าตัวยึดตำแหน่งเครื่องหมายคำถาม แต่อาจมีประโยชน์สำหรับข้อความค้นหาที่เกี่ยวข้องกับค่าที่มีการสอดแทรกจำนวนมาก
วิธีใช้ Where Not &Where Or Conditions
มาดูคำค้นหาที่ซับซ้อนกว่านี้กัน
หากคุณต้องการตรวจสอบว่าเงื่อนไขไม่เป็นความจริง คุณสามารถรวม where
ด้วย not
วิธีการ
นี่คือตัวอย่าง :
Book.where.not(category: "Java")
ตัวอย่างอื่น :
Book.where.not(title: nil)
พบ Book
ที่มี title
นั่นไม่ใช่ nil
.
แล้วเงื่อนไข OR ล่ะ
คุณสามารถรวม where
ด้วย or
วิธีรับแถวที่ตรงกับเงื่อนไขตั้งแต่สองเงื่อนไขขึ้นไป
นี่คือวิธีการทำงาน :
Book.where(category: "Programming").or(Book.where(category: "Ruby"))
ซึ่งรวมสอง where
สืบค้นให้เป็นหนึ่งเดียว
ให้มันลอง!
Rails Where IN Array Example
ตัวอย่างทั้งหมดที่เราได้เห็นจะมองหาค่าเฉพาะค่าเดียว
แต่คุณสามารถหาค่าได้หลายค่า
อย่างไร
ใช้อาร์เรย์!
ตัวอย่าง :
Book.where(id: [1,2,3])
สิ่งนี้จะสร้างข้อความค้นหา "IN" ที่จะค้นหารหัสเหล่านี้ทั้งหมดพร้อมกัน
SELECT "books".* FROM "books" WHERE "books"."id" IN (1, 2, 3)
คุณจะพบคำค้นหานี้ในบันทึกของราง
Rails เข้าร่วมเงื่อนไขสมาคม
หากคุณต้องการจับคู่ตามค่าการเชื่อมโยง คุณจะต้องทำให้การเชื่อมโยงนั้นใช้ได้กับ joins
วิธีการ
คุณก็ทำได้ :
Book.joins(:comments).where(comments: { id: 2 })
ด้วยแบบสอบถามนี้ คุณจะได้หนังสือทั้งหมดที่มีความคิดเห็นและความคิดเห็น id
คือ 2
.
สำหรับเวอร์ชันสตริง :
Book.joins(:comments).where("comments.id = 2")
โดยที่ comments
เป็นชื่อตาราง และ id
คือชื่อคอลัมน์
วิธีค้นหาข้อความภายในด้วยเงื่อนไข LIKE ที่ไหน
หากคุณต้องการใช้ฟังก์ชันการค้นหา คุณอาจต้องอนุญาตให้มีการจับคู่บางส่วน
คุณทำได้โดยใช้ข้อความค้นหา "LIKE"
นี่คือตัวอย่าง :
Book.where("title LIKE ?", "%" + params[:q] + "%")
สิ่งนี้จะค้นหาชื่อทั้งหมดที่มีข้อความค้นหา โดยพารามิเตอร์ (params[:q]
) ที่ใดก็ได้ภายในชื่อ
คำค้นหาที่เป็นประโยชน์มาก!
สัญลักษณ์ร้อยละ . คืออะไร ?
ใน SQL %
เป็นอักขระตัวแทน
วิดีโอ:Where vs Find_By in Detail
สรุป
คุณได้เรียนรู้วิธีการใช้ Rails where
วิธีการสอบถาม ActiveRecord
. ของคุณ โมเดล!
รวมถึง :
- วิธีการกรองตามเงื่อนไขต่างๆ
- วิธีใช้อาร์เรย์เพื่อค้นหาหลายแถวอย่างมีประสิทธิภาพ
- วิธีใช้
where
ร่วมกับor
¬
วิธีเขียนข้อความค้นหาที่ซับซ้อนมากขึ้น
ตอนนี้ถึงตาคุณแล้วที่จะนำสิ่งนี้ไปปฏิบัติ
ขอบคุณที่อ่านนะคะ 🙂