Fast JSON API trong Ruby On Rails
Bài đăng này đã không được cập nhật trong 6 năm
Chúng ta cùng bắt đầu nhé
Fast JSON API
gem cung cấp tất cả các chức năng chính mà Active Model Serializer
(AMS) có cung cấp, nhưng nó nhấn mạnh về tốc độ
và hiệu suất
hơn bằng cách đáp ứng yêu cầu benchmark nhanh gấp 25 lần. Trong khi AMS
bắt đầu chậm lại khi một model có nhiều relationships. Gem fast_jsonapi
cũng thực hiện performance testing
như một nguyên tắc.
Một số thông số chứng minh tính vượt trội về tốc độ của fast_jsonapi
Các bài test hiệu năng cho thấy tốc độ tăng 25-40 lần so với AMS, về cơ bản làm cho thời gian tuần tự hóa không đáng kể đối với các model phức tạp. Hiệu suất đạt được là đáng kể khi số lượng các bản ghi tuần tự tăng.
Benchmark times for 250 records
$ rspec
Active Model Serializer serialized 250 records in 138.71 ms
Fast JSON API serialized 250 records in 3.01 ms
Tại sao lại tối ưu hóa serialization?
Việc tuần tự hóa JSON API
thường là một trong những phần chậm nhất
của nhiều API Rails
. Vậy tại sao chúng ta lại không cung cấp tất cả các chức năng chính mà AMS có nhưng với tốc độ cao hơn?
Tính năng
- Cú pháp khai báo tương tự Active Model Serializer
- Hỗ trợ cho cả belongs_to, has_many và has_one
- Hỗ trợ các document ghép (included)
- Tối ưu tuần tự hóa các document ghép
- Caching
- Theo dõi với tích hợp Skylight (tùy chọn)
Cài đặt
Thêm dòng này vào Gemfile:
gem 'fast_jsonapi'
Chạy
$ bundle install
Cùng sử dụng nào
Có thể khởi tạo một serializer
sử dụng Rails Generator
:
rails g serializer Movie name year
Nó sẽ tạo ra một serializer
mới trong app/serializers/movie_serializer.rb
Định nghĩa Model
class Movie
attr_accessor :id, :name, :year, :actor_ids, :owner_id, :movie_type_id
end
Viết một serializer bằng cách sử dụng Fast JSONAPI?
Cú pháp khai báo của fast_jsonapi
tương tự như AMS
.
class MovieSerializer
include FastJsonapi::ObjectSerializer
attributes :name, :year
has_many :actors
belongs_to :owner, record_type: :user
belongs_to :movie_type
end
Ở đây có khác một chút so với AMS là include FastJsonapi::ObjectSerializer
thay vì extends ActiveModelSerializer
, nhưng nó vẫn hỗ trợ các quan hệ như thường.
Ví dụ:
movie = Movie.new
movie.id = 232
movie.name = 'Superman!'
movie.actor_ids = [1, 2, 3]
movie.owner_id = 3
movie.movie_type_id = 1
movie
Một số Object Serialization
Return a hash
hash = MovieSerializer.new(movie).serializable_hash
Return Serialized JSON
json_string = MovieSerializer.new(movie).serialized_json
Serialized Output
{
"data": {
"id": "3",
"type": "movie",
"attributes": {
"name": "Superman!",
"year": null
},
"relationships": {
"actors": {
"data": [
{
"id": "1",
"type": "actor"
},
{
"id": "2",
"type": "actor"
}
]
},
"owner": {
"data": {
"id": "3",
"type": "user"
}
}
}
}
}
Format JSON
trả về chỉ có một kiểu duy nhất
, khi muốn thay đổi thì chúng ta phải edit code
. Nó không linh hoạt như AMS, có vài kiểu adapter cho phép người dùng tùy chọn.
Attributes
Sử dụng method attributes
để định nghĩa attributes trong FastJsonapi
. Method này cũng có bí danh
là attribute
phù hợp khi định nghĩa một thuộc tính đơn.
Theo mặc định, các thuộc tính được đọc trực tiếp
từ thuộc tính mô hình có cùng tên.
class MovieSerializer
include FastJsonapi::ObjectSerializer
attribute :name
end
Có thể định nghĩa những thuộc tính custom với khai báo sử dụng cú pháp block của Ruby:
class MovieSerializer
include FastJsonapi::ObjectSerializer
attributes :name, :year
attribute :name_with_year do |object|
"#{object.name} (#{object.year})"
end
end
Cũng có thể ghi đè
các thuộc tính đã có với cú pháp trên:
class MovieSerializer
include FastJsonapi::ObjectSerializer
attribute :name do |object|
"#{object.name} Part 2"
end
end
Các thuộc tính cũng có thể sử dụng một tên khác
bằng cách truyền method gốc hoặc accessor
bằng shortcut proc
:
class MovieSerializer
include FastJsonapi::ObjectSerializer
attributes :name
attribute :released_in_year, &:year
end
Thú vị đúng không nào
All rights reserved