2017-01-21 4 views
3

現在、特定のイベントに基づいてActiveRecordオブジェクトを外部サービスに渡す必要がある、小さなRails 5アプリケーションを開発中です。私のモデルでは、私は次のように定義されていますRailsのオブジェクトの関連付けを動的にインクルードする

# /models/user.rb 
after_create :notify_external_service_of_user_creation 

def notify_external_service_of_user_creation 
    EventHandler.new(
    event_kind: :create_user, 
    content: self 
) 
end 

EventHandlerは、JSONにこのオブジェクトに変換され、外部サービスへのHTTPリクエストを通してそれを送信しています。

{ 
    "id":1234, 
    "email":"[email protected]", 
    "first_name":"Thomas", 
    "last_name":"Anderson", 
    "association_id":12, 
    "another_association_id":356 
} 

は今、私はこれに直接、すべての最初のレベルの関連付けを含める方法が必要になり、代わりにちょうどFOREIGN_KEYを示す:オブジェクトに.to_jsonを呼び出すことで、これはこのようになりますJSON出力をレンダリングします。 objectこの場合のユーザのインス​​タンスであるobject.class.name.constantize.reflect_on_all_associations.map(&:name)と、このリストを使用します。

{ 
    "id":1234, 
    "email":"[email protected]", 
    "first_name":"Thomas", 
    "last_name":"Anderson", 
    "association_id":{ 
    "attr1":"some_data", 
    "attr2":"another_value" 
    }, 
    "another_association_id":{ 
    "attr1":"some_data", 
    "attr2":"another_value" 
    }, 
} 

私の最初の考えはそうのようなモデルに反映させるためだった。だから私は探していますコンストラクトは、このようなものになるだろう関連付けをループして出力に含めます。これはむしろ面倒だと思われますので、Ruby 2.4とRails 5を使ってこれを実現するより良い方法があるのだろうかと思っていました。

+0

あなたはJSONのシリアライズのために何を使うのですか? https://github.com/rails-api/active_model_serializersは関連付けをサポートしています。 – MikDiet

+0

@MikDiet私はobejctで '.to_json'を呼び出しています。それだけです。 – Severin

答えて

0

外部シリアライザを使いたくない場合は、モデルごとにas_jsonas_jsonto_jsonによって呼び出されます。

module JsonWithAssociations 
    def as_json 
    json_hash = super 

    self.class.reflect_on_all_associations.map(&:name).each do |assoc_name| 
     assoc_hash = if send(assoc_name).respond_to?(:first) 
        send(assoc_name).try(:map, &:as_json) || [] 
        else 
        send(assoc_name).as_json 
        end 

     json_hash.merge!(assoc_name.to_s => assoc_hash) 
    end 

    json_hash 
    end 
end 

それがデフォルトas_jsonメソッドをオーバーライドするように、この特定のモジュールprependする必要があります。

User.prepend(JsonWithAssociations) 

または

class User 
    prepend JsonWithAssociations 
end 
関連する問題