Lấy hết các attributes của object trong serializer

Đăng bởi Lưu Đại vào ngày 05-01-2023

1. Bối cảnh: 

Dự án mình sử dụng gem active model serializer
Mình cần lấy tất cả attributes của 1 object (object có nhiều attributes và mình không muốn list hết ra) và có thêm 1 số attributes đi kèm khác nữa.

2. Giải quyết:

Mọi người để ý thì trong serializer sẽ gọi attributes.
Mặc định hàm attributes sẽ xử lý như sau: 
def attributes(requested_attrs = nil, reload = false)
  @attributes = nil if reload
  @attributes ||= self.class._attributes_data.each_with_object({}) do |(key, attr), hash|
    next if attr.excluded?(self)
    next unless requested_attrs.nil? || requested_attrs.include?(key)
    hash[key] = attr.value(self)
  end
end
* https://github.com/rails-api/active_model_serializers/blob/0-10-stable/lib/active_model/serializer.rb
Hàm này sẽ chỉ lấy những attribute được truyền vào requested_attrs.include(key), hoặc khi không có requested_attrs thì nó sẽ lấy tất cả attribute của object.
Nếu không truyền gì vào attributes thì mục đích đầu tiên cần lấy tất cả attributes của 1 object đã thành công nhưng không thể thêm 1 vài custom attributes vào. 
Để lấy hết attributes của object sau khi đi qua serializer thì mình viết đè lại hàm attributes. 
def attributes(*_args)
  keys = object.attributes

  ADDITIONAL_ATTR.each do |attr|
    keys[attr] = send(attr)
  end

  keys.symbolize_keys
end

ADDITIONAL_ATTR là một biến chứa symbol các custom attribute mà mình muốn thêm vào, sau đó viết lại định nghĩa các biến này vào các hàm trong class như khi dùng bình thường là được.