ขอบเขตใน Rails คืออะไรและเหตุใดจึงมีประโยชน์
ก็…
ขอบเขตคือข้อความค้นหาแบบกำหนดเองที่คุณกำหนดภายในโมเดล Rails ของคุณด้วย scope
วิธีการ
ทุกขอบเขตใช้สองอาร์กิวเมนต์ :
- ชื่อที่คุณใช้เรียกขอบเขตนี้ในโค้ดของคุณ
- แลมบ์ดาซึ่งใช้การสืบค้นข้อมูล
หน้าตาเป็นแบบนี้ :
class Fruit < ApplicationRecord scope :with_juice, -> { where("juice > 0") } end
เมื่อเรียกใช้ขอบเขต คุณจะได้รับ ActiveRecord::Relation
วัตถุ
ซึ่งหมายความว่าคุณสามารถเชื่อมโยงและรวมขอบเขตได้!
ตัวอย่าง :
Fruit.with_juice.with_round_shape.first(3)
ตอนนี้ :
มีอะไรให้เรียนรู้เพิ่มเติมเกี่ยวกับขอบเขต Rails อีกมาก ดังนั้นเรามาสำรวจหัวข้อกันต่อ
ควรใช้ขอบเขตเมื่อใด
โอเค สโคปก็เจ๋ง แต่คุณควรใช้เมื่อไหร่?
มาดูตัวอย่างกัน
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
เยี่ยมเลย!
วิธีใช้ขอบเขต Rails กับอาร์กิวเมนต์
คุณอาจต้องการแนะนำตัวแปรในขอบเขตเพื่อให้มีความยืดหยุ่นมากขึ้น
ตามนี้ :
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
วิธีการปิดการใช้งานขอบเขตที่ใช้ในปัจจุบันทั้งหมด
ชมวิดีโอการสอน
สรุป
ทำได้ดีมาก! จากการอ่านบทความนี้ คุณได้เรียนรู้วิธีใช้ขอบเขต Rails อย่างมีประสิทธิภาพสูงสุด
อย่าลืมนำความรู้ใหม่นี้ไปปฏิบัติเพื่อให้คุณจำได้ว่ามันทำงานอย่างไร
ขอบคุณที่อ่าน. 🙂