0

私はVendor(id、name、lat、lon、created_at)というモデルを持っています。 そして、現在の緯度と経度からベンダーの距離を見つけることができます。ActiveModelシリアライザに追加フィールドを追加

クエリは、 - 私は{ID、緯度、経度、名前、のcreated_at、距離}として直列化されたオブジェクトを持っていたい

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 

-

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

Vendor.select(query) 

としてIがシリアライザクラスを有しています。 モデルの属性がアタッチされますが、追加のフィールド/属性、つまりシリアル化されたハッシュに「距離」を追加するにはどうすればよいですか?

答えて

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?を見つけて呼び出しようとします。メソッドが存在し、偽の値を返す場合、属性は出力に含まれません。

+0

これが私に与えていませんが、「距離"jsonで。 –

+0

@ palash-kulkarni:再生できません。私のために働く。 –

+0

私もこれを試しました。しかし、仕事はなかった。私は、選択したクエリで「距離」としたいベンダーモデルの一部ではない、余分な属性を考えています。だから、それは追加されていない –

0

あなたはここでアクティブなモデルシリアライザにガイドされている

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

    def some_extra_attribute 
     object.some_extra_attribute # Or any other calculation inside this method 
    end 


end 
関連する問題