Rails API设计:使用json_api关系包含其他属性的最佳方式

时间:2016-07-02 16:19:24

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

我有一个Rails 5应用程序,其中我使用了gem active_model_serializershttps://github.com/rails-api/active_model_serializers)。在我的应用程序中,我有一个简化的数据模型,如下所示:

# LocalizedString.rb
has_many :translations

# Translation.rb
belongs_to :localized_string

我试图遵循JSON API中的最佳做法,我已按照以下方式配置active_model_serializers

ActiveModelSerializers.config.adapter = :json_api

当API的用户请求翻译(http://[root]/api/apps/117/translations)时,我目前得到以下结果:

{
  "data": [
    {
      "id": "152",
      "type": "translations",
      "attributes": {
        "value": "Test",
      },
      "relationships": {
        "language": {
          "data": {
            "id": "1",
            "type": "languages"
          }
        },
        "localized-string": {
          "data": {
            "id": "162",
            "type": "localized-strings"
          }
        }
      }
    },
    [...]

从我的localised-string我还想包含另一个对API的使用者至关重要的属性,并且我不想再进行另一个API调用来获取属性的值。我想知道如果可能的话,最好/推荐的方法是json_api

这样的事情可行:

"localized-string": {
  "data": {
    "id": "162",
    "key": "my key value", # the attribute I need.
    "type": "localized-strings"
  }
}

但我不确定如何使用active_model_serializers实现这一目标,或者是否是使用[json_api][1]执行我想要的其他推荐方法。

为了完成,我的相关序列化文件看起来像这样:

class TranslationSerializer < ActiveModel::Serializer
  attributes :id, :value, :created_at, :updated_at

  has_one :language
  has_one :localized_string, serializer: LocalizedStringParentSerializer
end

class LocalizedStringParentSerializer < ActiveModel::Serializer
  # I want to include the key attribute in my relationship object, but this doesn't work. 
  attributes :id, :key
end

那么,关于我需要做些什么来实现我想要的东西?

1 个答案:

答案 0 :(得分:2)

根据规范,关系由资源对象标识符表示。要包含不仅仅是id和type,您还需要使用include param。在AMS中,我认为这将是'include:[:localizations],fields:{localizations:[:key]}'(现在不是在计算机上,但是在右边)