如何使用Ember的Active Model Adapter和Rails的Active Model Serializer正确设置单表继承结构?

时间:2016-01-02 05:37:21

标签: ember.js active-model-serializers

我正在创建一个人类玩家与僵尸玩家的棋盘游戏,这两种类型都存储在players表格中,type列。每个玩家都有自己的棋盘。

我有一个使用活动模型序列化程序gem的Rails API。 我的ember应用程序使用活动模型适配器连接到它。

以下是我的序列化程序:

class GameSerializer < ActiveModel::Serializer
    attributes :id, :winner_id, :created_at, :updated_at
    has_many :players, polymorphic: true, serializer: PlayerSerializer
end

class PlayerSerializer < ActiveModel::Serializer
    ### Players can be type Human or Bot  
    attributes :id, :name, :game_id, :type, :created_at, :updated_at
    has_one :board
end

class BoardSerializer < ActiveModel::Serializer
    attributes :id, :player_id, :created_at, :updated_at
    has_one :player, polymorphic: true
    has_many :pieces
end

这是我的Ember模特:

// game.js
import DS from 'ember-data';

export default DS.Model.extend({
    players: DS.hasMany('players', {async: true, polymorphic: true}),
    human: DS.belongsTo('human', {async: true}),
    bot: DS.belongsTo('bot', {async: true})
});

// player.js
import DS from 'ember-data';

export default DS.Model.extend({
    game_id: DS.attr(),
    name: DS.attr(),
    game: DS.belongsTo('game', {async: true }),
    board: DS.belongsTo('board', {async: true})
});

// human.js
import DS from 'ember-data';
import Player from './player';

export default Player.extend({
    type: DS.attr('string', {defaultValue: 'Human'})
});

// bot.js
import DS from 'ember-data';
import Player from './player';

export default Player.extend({
    type: DS.attr('string', {defaultValue: 'Bot'})
});

// board.js
import DS from 'ember-data'
export default DS.Model.extend({
    player_id: DS.attr(),
    player: DS.belongsTo('player', { async: true, polymorphic: true }),
    pieces: DS.hasMany('pieces', { async: true })
})

games.show路线上,我希望能够拨打game.get('human.board.pieces')game.get('bot.board.pieces')之类的内容,但无论我尝试什么,game.get('human.board.id')始终会返回undefined }。我也试过从商店单独检索电路板,但player_id在电路板上,而不是相反。

任何人都可以帮我弄清楚如何正确配置我的AMS序列化器和Ember模型吗?

1 个答案:

答案 0 :(得分:0)

我最终将人类和机器人视为他们自己的模型,因为我永远不会在Ember应用程序中调用game.get('players')这个并且它有效。无需触摸播放器,人体,机器人或棋盘模型。

// game.js
export default DS.Model.extend({
    human: DS.belongsTo('human', {async: true}),
    bot: DS.belongsTo('bot', {async: true})
});