- Rails main branch vừa merge lệnh `rails query` — chạy ActiveRecord từ CLI, trả JSON có columns, rows, pagination, query time và SQL đã sinh.
- Kèm subcommands schema/models/explain, chế độ read-only mặc định — rất hợp cho LLM agent, script ops và debug nhanh.
TL;DR
Newsletter This Week in Rails ngày 17/04/2026 xác nhận Rails main đã merge rails query — lệnh CLI chạy ActiveRecord ở chế độ chỉ-đọc và trả JSON có đầy đủ columns, rows, meta (row_count, query_time_ms, page, per_page, has_more, sql). Có 3 subcommand kèm theo: query schema, query models, query explain. Cùng tuần còn có vài thay đổi nhỏ nhưng đáng chú ý: static CSS/HTML giờ gắn charset=utf-8, app mới có sẵn trang PWA offline fallback, ParameterFilter tăng tốc lên O(1) cho regexp exact-match.
Có gì mới
Lệnh rails query (PR #57156) nhận một biểu thức ActiveRecord và in ra JSON có cấu trúc:
$ rails query "Account.where(plan: 'premium').limit(2)"Kết quả có 3 khối chính:
columns— mảng tên cộtrows— mảng dữ liệu dòngmeta—row_count,query_time_ms,page,per_page,has_more, vàsql(SQL đã sinh)
Đi kèm là 3 subcommand:
rails query schema— dump schema databaserails query models— liệt kê các ActiveRecord modelrails query explain— trả về EXPLAIN plan cho một query
Điểm quan trọng: lệnh này read-only. Không có cửa cho update_all, destroy, hay callback mutate dữ liệu — khác hẳn rails runner vốn cho chạy bất kỳ Ruby nào.
Vì sao đáng chú ý
Trước giờ, muốn query ActiveRecord ngoài rails console có 2 lựa chọn, cả hai đều khó chịu:
rails runner "puts Model.where(...).to_json"— chạy được nhưng không có pagination, không timing, không echo SQL, và không có rào chắn ghi. Vô tình gõdestroy_alllà mất data.rails dbconsole— SQL thuần, mất hết scope, association, model logic.
rails query lấp đúng khoảng giữa: vẫn là ActiveRecord thật (scope, association, enum, serializer), JSON output chuẩn để pipe sang jq, và không cho phép mutate. Đây chính xác là kiểu interface mà LLM agent hay MCP server cần khi muốn cho AI đọc data mà không lo phá DB.
Chi tiết kỹ thuật
Cấu trúc meta block trong output:
| Key | Kiểu | Ý nghĩa |
|---|---|---|
row_count | Integer | Số dòng trả về |
query_time_ms | Float | Thời gian chạy query (ms) |
page | Integer | Trang hiện tại |
per_page | Integer | Số dòng mỗi trang |
has_more | Boolean | Còn trang sau không |
sql | String | SQL đã sinh ra |
Subcommand explain trả về EXPLAIN plan ở JSON, gom phần phân tích slow query vào cùng CLI. schema và models giúp tooling, docs, hoặc admin UI khám phá DB mà không phải parse file schema.rb.
Những thay đổi đáng chú ý khác trong tuần
- Charset UTF-8 cho static asset (PR #57188):
ActionDispatch::FileHandler#try_filesgiờ append; charset=utf-8vào Content-Type header cho file CSS và HTML tĩnh. Hết cảnh font ký tự lạ khi serve trực tiếp. - PWA offline fallback (PR #57184): app mới generate sẵn
app/views/pwa/offline.html.erb, routeget "offline"dạng comment, và service-worker template có ví dụ cache — bật dòng comment là dùng được. - ParameterFilter O(1) (PR #57166): với regexp anchored kiểu
/^code$/hoặc/\Atoken\z/, Rails extract literal string rồi lưu vào Hash để lookup O(1), thay vì iterate toàn bộ regexp. App có param list dài sẽ filter log nhanh hơn rõ rệt. - PR #57190 (
IO.copy_streamtrả về bytes đã ghi), #57187 (reset_counters cho string ID), #55865 (cảnh báo doc Active Storage về URL exposure). Tổng cộng 12 contributor góp PR tuần này.
Dùng vào đâu
- AI agent / MCP server: expose read-only query interface cho LLM mà không lo nó chạy
DELETE. JSON schema ổn định nên parse dễ. - CI & ops: one-liner kiểu
rails query "User.where('created_at > ?', 1.day.ago).count"rồi pipe quajqđể alert. - Incident debug: ra production shell gõ một lệnh, nhận rows + SQL + timing gọn trong một JSON.
- Tooling & admin UI:
rails query schema+rails query modelscho bootstrap mà không cần parseschema.rb. - Tối ưu slow query:
rails query explaingom EXPLAIN vào cùng CLI.
Hạn chế & availability
- Miễn phí, đi kèm Rails — không pricing.
- Hiện mới trên branch
main, chưa có trong bản Rails stable nào tại thời điểm 17/04/2026. Muốn dùng giờ thì chạy edge Rails. - Read-only — không có cửa cho write/destroy. Nếu cần mutate phải quay lại
rails runnerhoặc console. - Pagination qua
page/per_pagetrong meta; flag chi tiết xem trong PR. - Vẫn tốn thời gian boot Rails app như mọi rails command khác — không phù hợp cho vòng lặp cực nóng.
Tiếp theo
Lệnh sẽ xuất hiện ở bản Rails minor/major kế tiếp (TBA). Song song, PR #57152 đang mở review lại toàn bộ guide Layouts/Rendering — ai quan tâm docs có thể nhảy vào góp ý. Theo dõi trực tiếp edge để nghịch trước: chỉnh Gemfile trỏ vào rails/rails main.
Nguồn: This Week in Rails — 2026-04-17, PR #57156.