0

В моем приложении у меня была модель BlogPost и модель User, которые связаны соотношением по имени author. Для того, чтобы служить данные из моего приложения Rails Я использую active_model_serializers с определением:Как указать другое имя корня для внедренных объектов?

class Blog::PostSerializer < ActiveModel::Serializer 
    embed :ids, include: true 

    attributes :id, :title, :text, :created_at, :updated_at 

    has_one :author 
    has_many :assets 
end 

Когда я получать это, используя Ember модель:

Admin.BlogPost = DS.Model.extend({ 
    author:  DS.belongsTo('User'), 

    title:  DS.attr('string'), 
    text:  DS.attr('string'), 
    createdAt: DS.attr('date'), 
    updatedAt: DS.attr('date') 
}); 

Существует ошибка:

Uncaught Error: Assertion Failed: You looked up the 'author' relationship on a 'blog.post' with id 1 but some of the associated records were not loaded. Either make sure they are all loaded together with the parent record, or specify that the relationship is async (`DS.belongsTo({ async: true })`) 

, которая вызывается что мой ответ выглядит следующим образом:

{ 
    'blog_posts': [ 
    { 
     id: 1, 
     author_id: 1 
    }, 
    // … 
    ], 
    'authors': [ 
    { id: 1, /* … */ } 
    ] 
} 

Есть ли способ изменить 'authors' в ответ на 'users' или использовать 'authors' как псевдоним 'users' в сериализаторе?

ответ

1

Из active_model_serializers 0.8 описания: https://github.com/rails-api/active_model_serializers/tree/0-8-stable

Вы также можете указать другой корень для встроенных объектов, чем ключ, используемый для ссылки на них:

class PostSerializer < ActiveModel::Serializer 
    embed :ids, :include => true 

    attributes :id, :title, :body 
    has_many :comments, :key => :comment_ids, :root => :comment_objects 
end 

Это будет генерировать JSON, который будет выглядеть как это:

{"post": { 
    "id": 1, 
    "title": "New post", 
    "body": "A body!", 
    "comment_ids": [ 1 ] 
}, 
"comment_objects": [ 
    { "id": 1, "body": "what a dumb post" } 
] 
} 
+0

Я знаю, но зачем делать дополнительные выписки, когда все может быть выбрано только одним. Я отправляю эти данные, но Ember не распознает их, поскольку использует другой ключ, чем ожидалось. – Hauleth

+0

Вы смешиваете разные вопросы. Async не означает, что вы выбираете только один или нет. И в вашей полезной нагрузке «авторы» ** после ** 'blog_posts' выглядит хорошо. Но ** внутри ** 'blog_posts' вы используете' author_id' (не вставляете полный 'author'), поэтому вы должны установить {async: true}. – artych

+0

Я проверил это, и это не то, что я имею в виду. 'async' означает, что он сделает подзапрос для каждого запрошенного элемента (когда и когда потребуется). Я хочу, чтобы Ember использовал данные, которые в настоящее время находятся в полезной нагрузке, чтобы получить информацию о 'User'. – Hauleth

0

Просто определите метод в вашем сериализаторе с именем users и верните в него автографы I.e.

attributes :id, :title, :text, :created_at, :updated_at, :users 

def users 
    object.authors 
end 
+0

У статьи есть один автор, также я хочу это t o называться 'author' (поскольку в статье автор не является пользователем). – Hauleth

+0

Ну, независимо от структуры, которую вы хотите, вы можете сделать это в методе: 'def author ... end' или' def author_id ... end', просто добавьте метод в атрибуты, и у вас будет любое пространство имен, которое вы хотите. – nesiseka

+0

Но тогда ответ будет иметь недопустимую структуру. Я просто хочу использовать данные, которые находятся в полезной нагрузке для загрузки 'User'. – Hauleth

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