# Ruby trên Maguyva: đồ thị mã cho Rails và ứng dụng Ruby

Canonical source: https://maguyva.ai/vi/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 hỗ trợ Ruby với AST, ký hiệu và đồ thị, để agent AI có thể lần theo lớp, module, phương thức singleton và constructor trong codebase Rails và Ruby.

## Tổng quan hỗ trợ

- Cấp độ: Hỗ trợ AST và symbol
- Lập trình
- Phần mở rộng: .gemfile, .gemspec, .rake, .rakefile, .rb, .rbw
- Phân tích AST thật cho tìm kiếm nhận biết cú pháp và context cấu trúc.
- Các symbol có tên cung cấp dữ liệu cho tra cứu ngữ nghĩa và tham chiếu chéo. Điều hướng graph khả dụng khi bật trích xuất quan hệ.
- Ngôn ngữ này đóng góp symbol và quan hệ cho tìm kiếm nhận biết graph; các loại edge được hỗ trợ thay đổi theo cấu trúc riêng của ngôn ngữ.
- Cả phân tích AST và trích xuất symbol đều khả dụng.

## Phù hợp nhất

- Ứng dụng Rails nguyên khối, nơi model, service object, job và concern gọi lẫn nhau qua nhiều thư mục.
- Gem và dịch vụ Ruby có namespace module lồng sâu và lớp cơ sở dùng chung.
- Các nhóm muốn khoanh vùng thay đổi cùng agent AI trước khi chạm vào một model hoặc service mà nửa ứng dụng phụ thuộc vào.

## Workflow agent

- Tìm mọi nơi gọi một service object hoặc phương thức model trước khi hành vi của nó thay đổi.
- Lần theo nơi một lớp được tạo bằng `.new` và những phương thức chạy sau đó.
- Lập bản đồ các lớp kế thừa từ một lớp cơ sở hoặc include một module trước khi refactor.

## Vì sao kho mã Ruby làm khó các công cụ AI hời hợt

Ruby dựa nhiều vào quy ước và metaprogramming. Phương thức được sinh ra bởi `attr_accessor`, lớp được mở lại ở tệp khác, và namespace lồng module qua nhiều cấp. Bề mặt dễ đọc che đi việc một lời gọi thực sự dẫn tới phương thức nào, và một tìm kiếm văn bản thô sẽ trả về mọi `call` và mọi `perform` trong ứng dụng.

Maguyva đưa cho agent lớp, module, phương thức và nơi gọi dưới dạng cấu trúc, để nó lần theo thay đổi xuyên suốt ứng dụng thay vì đoán.

## Maguyva trích xuất gì từ Ruby

Maguyva bao phủ các tệp `.rb`, `.rbw`, `.rake` và `.gemspec`, cùng với `Gemfile` và `Rakefile`. Phương thức instance và phương thức singleton (`def self.call`) được trích xuất, trong đó phương thức singleton được đánh dấu là static. Khai báo `attr_reader`, `attr_writer` và `attr_accessor` được tính là phương thức truy cập, và ký hiệu được định danh theo namespace module và lớp.

`ClassName.new` và `Namespace::ClassName.new` được tính là khởi tạo, và việc xác định kiểu receiver theo dõi phép gán cục bộ và `@instance_variables`, nên lời gọi trên một đối tượng đã gán có thể được phân giải về lớp của nó. Đồ thị cũng ghi lại kế thừa, include module, ghi đè, các cạnh `raise` và `rescue`, cùng đọc và ghi.

Lời gọi metaprogramming (`define_method`, `send`, `method_missing`, `class_eval` và tương tự), helper kiểu `T::` của Sorbet và các lời gọi Enumerable phổ biến (`each`, `collect`, `reject` và tương tự) bị lọc khỏi quan hệ, để mã ứng dụng nổi bật lên.

## Ví dụ prompt cho agent

- "Ai gọi `Billing::ChargeCustomer.call`, và từ những job và controller nào?" (`find_symbol`, sau đó `dependency_search` theo chiều vào)
- "Những model nào kế thừa từ `ApplicationRecord` và include `Auditable`?" (`dependency_search`)
- "Lần theo điều gì xảy ra sau khi một đơn hàng được đánh dấu là đã thanh toán." (`get_task_context`)

## Giới hạn đã biết

- Trong Ruby, `require` và `load` là lời gọi phương thức thông thường, nên preset `imports` trong `structural_search` không chọn gì. Dùng `text_pattern_search` để liệt kê chúng.
- Phương thức được tạo lúc runtime bằng `define_method` hoặc do `method_missing` xử lý không được trích xuất thành ký hiệu, và các lời gọi đó bị lọc như nhiễu metaprogramming.
- Ruby không có cú pháp decorator, nên quan hệ decorator được đánh dấu là không áp dụng.

## Bước tiếp theo

Kết nối một kho mã bằng [hướng dẫn bắt đầu nhanh](/vi/docs/quickstart), sau đó xem ma trận hỗ trợ trên [trang tương thích](/vi/docs/compatibility). Với các kho mã ngôn ngữ động khác, hãy so sánh với [hướng dẫn Python](/vi/languages/python).

## Chi tiết engine

- Hỗ trợ Ruby bao phủ `.rb`, `.rbw`, `.rake`, `.gemspec`, `Gemfile` và `Rakefile`. Phương thức singleton được đánh dấu là static, và khai báo `attr_*` được tính là phương thức truy cập.
- `ClassName.new` được tính là khởi tạo, và việc xác định kiểu receiver theo dõi phép gán cục bộ và biến instance.
- Lời gọi metaprogramming như `define_method` và `send`, helper `T::` của Sorbet và các lời gọi Enumerable phổ biến bị lọc khỏi quan hệ.

## Điểm khởi đầu MCP hữu ích

- `find_symbol`: Dùng cho một lớp, module hoặc phương thức có namespace, như `Billing::ChargeCustomer.call`.
- `dependency_search`: Trước khi thay đổi, dùng duyệt theo chiều vào trên một model hoặc service object để thấy nơi gọi và lớp con.
- `text_pattern_search`: Dùng cho đường dẫn `require`, chuỗi route và các phương thức được định nghĩa động mà đồ thị không nhìn thấy.
