2016-07-02 4 views
3

У меня есть приложение Rails 5, в котором я использую драгоценный камень active_model_serializers (https://github.com/rails-api/active_model_serializers). В моем приложении у меня есть упрощенная модель данных, которая выглядит примерно так:Rails API Design: лучший способ включить другие атрибуты с отношениями json_api

# 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 I также хочу включить другой атрибут, который является критическим для потребителя 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].

Для завершения, мои соответствующие serialiser файлы выглядит Лик это:

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 

Таким образом, любые идеи о том, что мне нужно сделать, чтобы достичь того, чего я хочу?

ответ

2

По спецификациям отношения представлены идентификаторами объекта ресурса. Чтобы включить больше, чем просто идентификатор и тип, вы захотите использовать параметр include. В AMS я думаю, что это будет включать: [: локализации], поля: {localizations: [: key]} '(не сейчас на компьютере, но примерно справа)

 Смежные вопросы

  • Нет связанных вопросов^_^