Object Serializer với Fast JSON API trong Rails

Tram Ho

Object serializer là gì ?

Object serializer là công cụ để chúng ta có thể chuyển các object, cụ thể ở đây là các object trong rails, sang dạng JSON để phục vụ cho các HTTP response trả về dữ liệu dạng JSON.
Trong rails, để thực hiện serialize object, chúng ta có thể sử dụng các gem như fast_jsonapi, active_model_serializers hay có thể sửa dụng chính Active Model Serializer(AMS) mà rails cung cấp. Nhưng trong khuôn khổ bài viết này, mình sẽ giới thiệu tới các bạn gem fast_jsonapi nhé

Giới thiệu về gem Fast JSON API

Fast JSON API cung cấp hầu như mọi chức năng mà Active Model Serializer cung cấp. Tuy nhiên, ưu điểm của Fast JSON API nằm ở tốc độ và hiệu năng, thậm chí có thể gấp tới 25 lần về mặt thời gian so với Active Model Serializer. Chúng ta có thể thấy qua ví dụ sau đây:

Qua ví dụ trên thì chúng ta có thể thấy tốc độ của Fast JSON API vượt trội như thế nào đúng không

Các tính năng của Fast JSON API

Về cơ bản, Fast JSON API sẽ cung cấp cho chúng ta những chức năng chính sau đây:

  • Cú pháp khai báo tương tự như Active Model Serializer
  • Hộ trợ các quan hệ belongs_to, has_many, has_one
  • Hỗ trợ các document ghép
  • Caching

Cài đặt

Để cài đặt Fast JSON API, chúng ta thêm dòng này vào gem file và sau đó chạy bundle install:

Sau khi cài đặt xong thì chúng ta có thể sử dụng các tính năng của Fast JSON API rồi  Cùng tìm hiểu nhé!

Sử dụng

Chúng ta có thể sử dụng lệnh bundled generator

Lệnh này sẽ tạo ra trong project của bạn một serializer nằm trong app/serializers/movie_serializer.rb

Định nghĩa Model

Định nghĩa Serializer

Đây là phần quan trong nhất. Chúng ta sẽ định nghĩa xem một object sẽ được serialize như thế nào:

Cùng xem kết quả qua ví dụ sau nhé

Chúng ta sẽ tạo một object của lớp Movie như sau:

Sau đó chúng ta sẽ thực hiện serialize object này :

Return hash

Return JSON

Kết quả sẽ cho ra output như sau:

Attributes

Các attributes được định nghĩa trong Fast JSON API qua method attributes. Method này còn có alias là attribute, nó sẽ giúp code của chúng ta rõ ràng hơn khi định nghĩa một attribute đơn.

Mặc định thì các attributes của object serializer được định nghĩa bằng cách lấy các attributes cùng tên từ object trong Model. Ví dụ như class Movie ở trên, các thuộc tính như name, year,.. cũng sẽ được chuyển trực tiếp vào MovieSerializer:

Với Fast JSON API, chúng ta còn có thể tự định nghĩa các attributes bên cạnh các attributes có sẵn của object như sau:

Bằng việc implement thêm attribute :name_with_year, object serializer sẽ có thêm thuộc tính :name_with_year như ta đã định nghĩa ở trên.

Ngoài ra, chúng ta có thể ghi đè các attributes mặc định (các attributes được lấy trực tiếp từ Model object):

Các thuộc tính có thể sử dụng dưới một cái tên khác bằng cách truyền method gốc hoặc accessor bằng shortcut proc:

Collection serialization

Bên cạnh việc serialize một object độc lập như các ví dụ mình đã trình bày ở trên, chúng ta còn có thể serialize một collection các object. Cú pháp khai báo hoàn toàn tương tự:

Chúng ta có thể truyền thêm option is_collection để quản lý rõ ràng hơn việc serialize một collection hay một single object riêng lẻ. Mặc định nếu ta không truyền option này vào thì Fast JSON API sẽ tự hiểu và tự phân biệt khi nào truyền vào một collection, khi nào truyền vào một single object. Tuy nhiên, không phải lúc nào Fast JSON API cũng có thể hiểu và phân biệt đúng như chúng ta mong muốn.
Chính vì vậy mà Fast JSON API đã cung cấp cho chúng ta những option để quản lý việc serialize collection hoặc object dễ dàng hơn :

Các option của is_colletion đó là :

  • nil hoặc không truyền vào: Fast JSON API sẽ tự hiểu xem resource truyền vào là collection hay single object (Tuy nhiên, sẽ có một số hạn chế như mình đã viết ở trên)
  • true: sẽ luôn coi resource truyền vào là một collection
  • false: sẽ luôn coi resource truyền vào là một single object

Params

Trong một số trường hợp, các attribute của serializer object có thể mang nhiều thông tin hơn những attribute của object trong model. Việc truyền các params sẽ giúp chúng ta xử lý các trường hợp khác nhau một các dễ dàng hơn.
Nói thì hơi trừu tượng và khó hiểu, chúng ta cùng xem qua ví dụ sau nhé 😀

Ở ví dụ trên, chúng ta sẽ truyền params[:current_user] vào trong attribute :can_view_early, attribute này sẽ trả về true nếu params[:current_user].is_employee? là true, và trả về false nếu ngược lại. Chính vì thế mà giá trị của attribute can_view_early sẽ phụ thuộc vào params mà chúng ta truyền vào.

Conditional Relationship

Conditional Relationship có thể định nghĩa bằng cách truyền một Proc qua từ khóa if:. Relationship sẽ được serialize nếu Proc trả về true và ngược lại, sẽ không được serialize nếu Proc trả về false, tương tự thì chúng ta có thể truyền vào cả record cả params. Cùng xem qua ví dụ sau đây nhé :

Lời kết

Trên đây mình đã chia sẻ những kiến thức cơ bản nhất đủ để chúng ta có thể áp dụng Fast JSON API trong dự án của mình, để tìm hiểu thêm thì các bạn có thể xem qua link tham khảo mình để dưới đây nhé. Chúc các bạn thành công!
https://github.com/Netflix/fast_jsonapi

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo