为ActiveModel Serializer添加一个额外的字段

时间:2017-08-02 06:06:15

标签: ruby-on-rails ruby postgresql activerecord active-model-serializers

让我们说我有一个名为Vendor的模型(id,name,lat,lon,created_at)。 我有一个查询,其中我找到供应商与当前纬度和经度的距离。

查询是 -

query = "*, ST_Distance(ST_SetSRID(ST_Point(#{lat}, #{lon}), 4326)::geography,ST_SetSRID(ST_Point(lat, lon), 4326)::geography) as distance"

Vendor.select(query)

我将序列化程序类作为 -

class VendorSerializer < ActiveModel::Serializer
    attributes :id,
               :lat,
               :lon,
               :name,
               :created_at

    def attributes
        hash = super
        # I tried to override attributes and added distance but it doesn't add
        hash[:distance] = object.distance if object.distance.present?
        hash
    end
end

我希望序列化对象为{id,lat,lon,name,created_at,distance}。 所以模型属性得到了附加,但我如何添加额外的字段/属性,即“距离”到序列化哈希?

3 个答案:

答案 0 :(得分:1)

AMS内置了对此的支持。不需要肮脏的黑客。

class VendorSerializer < ActiveModel::Serializer
  attributes :id, :lat, :lon, :name, :created_at,
             :distance, :foobar


  def include_distance?
    object.distance.present?
  end

  def foobar
    'custom value'
  end

  def include_foobar?
    # ...
  end
end

对于每个属性,AMS都会尝试查找并调用方法include_ATTR?。如果方法存在并返回falsey值,则该属性不包含在输出中。

答案 1 :(得分:0)

您可以执行以下操作

onResume()

答案 2 :(得分:-1)

以下是活动模型序列化程序的指南: Active Model Serializer Guide

解决您的问题的方法是: Active Model Serializer Guide - Serializer