2015-09-29 6 views
5

Active Model SerializersとともにJSONAPI formatを使用して、rails-apiでアピを作成しています。アクティブモデルシリアライザのリレーションシップに使用するアトリビュートを選択するには

具体的なpostを表示しているシリアライザがあり、これは多くの場合topicsであり、現在のところ、リレーションシップの下でこれらのトピックがリストされています。現在のところ、IDとタイプのみがリストされています。私はトピックのタイトルも表示したい。

私のコントローラにはinclude: 'topics'を使用する人がいますが、そのトピックのタイトルだけを完全に記録する必要はありません。

質問:トピックから表示する属性を指定する方法を教えてください。

は私が

"data": { 
    "id": "26", 
    "type": "posts", 
    "attributes": { 
    "title": "Test Title 11" 
    }, 
    "relationships": { 
    "topics": { 
     "data": [ 
     { 
      "id": "1", 
      "type": "topics" 
     } 
     ] 
    } 
    } 
} 

持っている私は何を

"data": { 
    "id": "26", 
    "type": "posts", 
    "attributes": { 
    "title": "Test Title 11" 
    }, 
    "relationships": { 
    "topics": { 
     "data": [ 
     { 
      "id": "1", 
      "type": "topics", 
      "title": "Topic Title" 
     } 
     ] 
    } 
    } 
} 

私の現在のシリアライザクラス EDIT欲しい:これは私がしてください後だものです。その下の答えは、この作品を作るがあるが、そのない本当に私が後だ何 -

class PostSerializer < ActiveModel::Serializer 
    attributes :title 

    belongs_to :domain 
    belongs_to :user 

    has_many :topics, serializer: TopicSerializer 

    def topics 
    # THIS IS WHAT I AM REALLY ASKING FOR 
    end 
end 

class TopicSerializer < ActiveModel::Serializer 
    attributes :title, :description 

    belongs_to :parent 
    has_many :children 
end 

ことの一つは、私はを試みました。

class PostSerializer < ActiveModel::Serializer 
    attributes :title, :topics 

    belongs_to :domain 
    belongs_to :user 

    def topics 
    # THIS WAS ANSWERED BELOW! THANK YOU 
    end 
end 

答えて

5

ただ、そのようなハッシュのハッシュや配列を返すようにしてください:

def videos 
    object.listing_videos.collect do |lv| 
     { 
     id: lv.video.id, 
     name: lv.video.name, 
     wistia_id: lv.video.wistia_id, 
     duration: lv.video.duration, 
     wistia_hashed_id: lv.video.wistia_hashed_id, 
     description: lv.video.description, 
     thumbnail: lv.video.thumbnail 
     } 
    end 
    end 
+0

ありがとうございました!それはうまくいった。 – alassiter

+0

私はこの回答をupvoted b/cそれは私が提示した問題の一つに答えた。私はこの質問を混同するつもりはありませんでしたが、同じ問題に再び遭遇した後、私は私が不明であることに気付きました。私はこれについての礼儀がわからないので、私を許してください。質問は、関係についての属性を指定することを意図していました。「私が欲しいもの」と答え、ここでの答えは、私が試したことの一つに拡大しています。それはうまくいくが、私が本当に欲しいのは違う。 – alassiter

+0

私はドキュメントの中でこの良い例を見ていないので、私はそれがサポートされていないと言っていますか、それが好きなように動作しません。アソシエーションをオーバーライドする関数は、アトリビュートではなくスコープを変更するように見えるように見えます。こちらをご覧くださいhttps://github.com/rails-api/active_model_serializers#user-content-overriding-association-methods。コントローラに関連するデータをインクルードしたりロードしたりしないと、シリアライザにN + 1が発生しませんか?あなたがpostgresを使用しているなら、あなたはdbからJSONを返すか、SQLのデータをマッサージしてカスタムシリアライザを持つことができます。 – penner

0

代わりの話題メソッドを定義し、それが明示的にする必要がありますかどの属性を指定して別のトピックのシリアライザを定義する方が良いでしょう含める。これはトピックメソッドを定義するよりクリーンでより保守的なアプローチです。

class PostSerializer < ActiveModel::Serializer 
    attributes :title 

    belongs_to :domain 
    belongs_to :user 
    # remember to declare TopicSerializer class before you use it 
    class TopicSerializer < ActiveModel::Serializer 
    # explicitly tell here which attributes you need from 'topics' 
    attributes :title 
    end 
    has_many :topics, serializer: TopicSerializer 
end 

ここでも、それはきれいで、どちらも保守性はありませんが、できるだけ多くの関係のためのメソッドを定義しないようにしてください。

関連する問題