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ột
  • rows — mảng dữ liệu dòng
  • metarow_count, query_time_ms, page, per_page, has_more, và sql (SQL đã sinh)

Đi kèm là 3 subcommand:

  • rails query schema — dump schema database
  • rails query models — liệt kê các ActiveRecord model
  • rails 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_all là 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:

KeyKiểuÝ nghĩa
row_countIntegerSố dòng trả về
query_time_msFloatThời gian chạy query (ms)
pageIntegerTrang hiện tại
per_pageIntegerSố dòng mỗi trang
has_moreBooleanCòn trang sau không
sqlStringSQL đã sinh ra

Subcommand explain trả về EXPLAIN plan ở JSON, gom phần phân tích slow query vào cùng CLI. schemamodels 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_files giờ append ; charset=utf-8 và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, route get "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_stream trả 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 qua jq để 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 models cho bootstrap mà không cần parse schema.rb.
  • Tối ưu slow query: rails query explain gom 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 runner hoặc console.
  • Pagination qua page/per_page trong 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.