如何为活动模型序列化程序关系选择所需的属性

时间:2015-09-29 21:24:24

标签: ruby-on-rails json active-model-serializers rails-api

我正在使用JSONAPI formatActive Model Serializersrails-api创建一个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"
        }
      ]
    }
  }
}

我当前的序列化程序类编辑:这就是我想要的。

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

2 个答案:

答案 0 :(得分:7)

确保返回哈希值或哈希数组,如下所示:

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

答案 1 :(得分: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

同样,尽量避免尽可能地定义关系方法,它不干净,既不可维护。