# Ruby บน Maguyva: กราฟโค้ดสำหรับ Rails และแอป Ruby

Canonical source: https://maguyva.ai/th/languages/ruby

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

Maguyva รองรับ Ruby ด้วย AST สัญลักษณ์ และกราฟ เพื่อให้เอเจนต์ AI ติดตามคลาส โมดูล singleton method และคอนสตรักเตอร์ในโค้ดเบส Rails และ Ruby

## ภาพรวมการรองรับ

- ระดับ: รองรับ AST และสัญลักษณ์
- การเขียนโปรแกรม
- นามสกุลไฟล์: .gemfile, .gemspec, .rake, .rakefile, .rb, .rbw
- การแยกวิเคราะห์ AST จริงสำหรับการค้นหาที่รู้จักไวยากรณ์และบริบทเชิงโครงสร้าง
- สัญลักษณ์ที่มีชื่อป้อนข้อมูลให้การค้นหาเชิงความหมายและการอ้างอิงไขว้ การนำทางกราฟจะใช้งานได้เมื่อเปิดใช้การสกัดความสัมพันธ์
- ภาษานี้ส่งสัญลักษณ์และความสัมพันธ์ไปยังการค้นหาแบบรู้บริบทกราฟ โดยประเภทเอดจ์ที่รองรับจะแตกต่างกันตามโครงสร้างเฉพาะของภาษา
- รองรับทั้งการแยกวิเคราะห์ AST และการสกัดสัญลักษณ์

## เหมาะที่สุดสำหรับ

- Rails แบบโมโนลิธที่ model, service ออบเจกต์, job และ concern เรียกกันข้ามหลายไดเรกทอรี
- gem และบริการ Ruby ที่มี namespace ของโมดูลซ้อนลึกและคลาสฐานที่ใช้ร่วมกัน
- ทีมที่ต้องการกำหนดขอบเขตการเปลี่ยนแปลงร่วมกับเอเจนต์ AI ก่อนแตะ model หรือบริการที่แอปครึ่งหนึ่งพึ่งพา

## เวิร์กโฟลว์ของเอเจนต์

- หาผู้เรียกทุกรายของ service ออบเจกต์ หรือเมธอดของ model ก่อนเปลี่ยนพฤติกรรม
- ติดตามว่าคลาสถูกสร้างด้วย `.new` ที่ใด และหลังจากนั้นเมธอดใดทำงาน
- ทำแผนที่คลาสที่สืบทอดจากคลาสฐานหรือ include โมดูลหนึ่ง ก่อนการรีแฟกเตอร์

## ทำไมรีโพซิทอรี Ruby จึงยากสำหรับเครื่องมือ AI แบบผิวเผิน

Ruby พึ่งพาแบบแผนและเมทาโปรแกรมมิงอย่างมาก เมธอดถูกสร้างโดย `attr_accessor` คลาสถูกเปิดใหม่ในไฟล์อื่น และ namespace ซ้อนโมดูลไว้หลายชั้น พื้นผิวที่อ่านง่ายซ่อนว่าการเรียกไปจบที่เมธอดใดจริง และการค้นหาข้อความแบบหยาบจะคืนทุก `call` และทุก `perform` ในแอป

Maguyva ให้คลาส โมดูล เมธอด และผู้เรียกกับเอเจนต์ในรูปของโครงสร้าง เพื่อให้ติดตามการเปลี่ยนแปลงไปทั่วแอปแทนการเดา

## Maguyva ดึงอะไรจาก Ruby ได้บ้าง

Maguyva ครอบคลุมไฟล์ `.rb`, `.rbw`, `.rake` และ `.gemspec` รวมถึง `Gemfile` และ `Rakefile` เมธอดของอินสแตนซ์และเมธอด singleton (`def self.call`) ถูกดึงออกมา โดยเมธอด singleton ถูกทำเครื่องหมายเป็น static การประกาศ `attr_reader`, `attr_writer` และ `attr_accessor` นับเป็นเมธอดแอคเซสเซอร์ และสัญลักษณ์ถูกระบุด้วย namespace ของโมดูลและคลาส

`ClassName.new` และ `Namespace::ClassName.new` นับเป็นการสร้างอินสแตนซ์ และการระบุชนิดของรีซีฟเวอร์ติดตามการกำหนดค่าตัวแปรท้องถิ่นและ `@instance_variables` การเรียกบนออบเจกต์ที่ถูกกำหนดค่าจึงรีโซลฟ์ไปยังคลาสของมันได้ กราฟยังบันทึกการสืบทอด การ include โมดูล การ override เส้นเชื่อม `raise` และ `rescue` และการอ่านและการเขียนด้วย

การเรียกแบบเมทาโปรแกรมมิง (`define_method`, `send`, `method_missing`, `class_eval` และอื่น ๆ ทำนองเดียวกัน) ตัวช่วยชนิดข้อมูล `T::` ของ Sorbet และการเรียก Enumerable ที่พบบ่อย (`each`, `collect`, `reject` และอื่น ๆ ทำนองเดียวกัน) ถูกกรองออกจากความสัมพันธ์ เพื่อให้โค้ดแอปโดดเด่นขึ้นมา

## ตัวอย่างพรอมต์สำหรับเอเจนต์

- "ใครเรียก `Billing::ChargeCustomer.call` และเรียกจาก job และ controller ใดบ้าง" (`find_symbol` แล้วตามด้วย `dependency_search` ทิศทางขาเข้า)
- "model ใดสืบทอดจาก `ApplicationRecord` และ include `Auditable`" (`dependency_search`)
- "ติดตามว่าเกิดอะไรขึ้นหลังคำสั่งซื้อถูกทำเครื่องหมายว่าชำระแล้ว" (`get_task_context`)

## ข้อจำกัดที่ทราบ

- ใน Ruby `require` และ `load` เป็นการเรียกเมธอดธรรมดา พรีเซ็ต `imports` ใน `structural_search` จึงไม่เลือกอะไรเลย ใช้ `text_pattern_search` เพื่อแสดงรายการเหล่านี้
- เมธอดที่สร้างขณะรันไทม์ด้วย `define_method` หรือที่ `method_missing` จัดการ จะไม่ถูกดึงออกมาเป็นสัญลักษณ์ และการเรียกเหล่านั้นถูกกรองออกในฐานะสัญญาณรบกวนจากเมทาโปรแกรมมิง
- Ruby ไม่มีไวยากรณ์เดคอเรเตอร์ ความสัมพันธ์เดคอเรเตอร์จึงถูกทำเครื่องหมายว่าไม่เกี่ยวข้อง

## ขั้นตอนถัดไป

เชื่อมต่อรีโพซิทอรีด้วย[คู่มือเริ่มต้นใช้งาน](/th/docs/quickstart) แล้วดูตารางการรองรับได้ที่[หน้าความเข้ากันได้](/th/docs/compatibility) สำหรับรีโพซิทอรีภาษาไดนามิกอื่น ให้เทียบกับ[คู่มือภาษา Python](/th/languages/python)

## รายละเอียดเอนจิน

- การรองรับ Ruby ครอบคลุม `.rb`, `.rbw`, `.rake`, `.gemspec`, `Gemfile` และ `Rakefile` เมธอด singleton ถูกทำเครื่องหมายเป็น static และการประกาศ `attr_*` นับเป็นเมธอดแอคเซสเซอร์
- `ClassName.new` นับเป็นการสร้างอินสแตนซ์ และการระบุชนิดของรีซีฟเวอร์ติดตามการกำหนดค่าตัวแปรท้องถิ่นและตัวแปรอินสแตนซ์
- การเรียกแบบเมทาโปรแกรมมิง เช่น `define_method` และ `send` ตัวช่วย `T::` ของ Sorbet และการเรียก Enumerable ที่พบบ่อยถูกกรองออกจากความสัมพันธ์

## จุดเริ่มต้น MCP ที่มีประโยชน์

- `find_symbol`: ใช้กับคลาส โมดูล หรือเมธอดที่อยู่ใน namespace เช่น `Billing::ChargeCustomer.call`
- `dependency_search`: ก่อนการเปลี่ยนแปลง ใช้การท่องกราฟทิศทางขาเข้าบน model หรือ service ออบเจกต์ เพื่อดูผู้เรียกและคลาสลูก
- `text_pattern_search`: ใช้กับพาธของ `require` สตริงเส้นทาง และเมธอดที่นิยามแบบไดนามิกซึ่งกราฟมองไม่เห็น
