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.
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:
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.
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.