Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

วิธีใช้ขอบเขตใน Ruby on Rails

ขอบเขตใน Rails คืออะไรและเหตุใดจึงมีประโยชน์

ก็…

ขอบเขตคือข้อความค้นหาแบบกำหนดเองที่คุณกำหนดภายในโมเดล Rails ของคุณด้วย scope วิธีการ

ทุกขอบเขตใช้สองอาร์กิวเมนต์ :

  1. ชื่อที่คุณใช้เรียกขอบเขตนี้ในโค้ดของคุณ
  2. แลมบ์ดาซึ่งใช้การสืบค้นข้อมูล

หน้าตาเป็นแบบนี้ :

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 อย่างมีประสิทธิภาพสูงสุด

อย่าลืมนำความรู้ใหม่นี้ไปปฏิบัติเพื่อให้คุณจำได้ว่ามันทำงานอย่างไร

ขอบคุณที่อ่าน. 🙂