【问题标题】:How do I properly set up a single-table inheritance structure using Ember's Active Model Adapter and Rails' Active Model Serializer?如何使用 Ember 的 Active Model Adapter 和 Rails 的 Active Model Serializer 正确设置单表继承结构?
【发布时间】:2016-01-04 09:10:59
【问题描述】:

我正在创建一个棋盘游戏,其中包含人类玩家与机器人玩家,两种类型都存储在带有 type 列的 players 表中。每个玩家都有自己的棋盘。

我有一个使用活动模型序列化程序 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 模型?

【问题讨论】:

  • 实际调用了正确的 API 端点吗?我假设您有一个players 端点或类似的端点,但默认情况下,至少有一些 Ember Data 适配器根据模型名称确定 API 端点名称。它可能试图访问botshumans 端点。您可能需要为这些模型创建自定义适配器,以强制它们使用正确的 API 端点。 guides.emberjs.com/v2.2.0/models/customizing-adapters
  • 是的,我有一个players 和一个humans 端点;两者都使用播放器序列化程序。

标签: ember.js active-model-serializers


【解决方案1】:

我最终将人类和机器人视为自己的模型,因为我永远不会在 Ember 应用程序中真正调用 game.get('players') 并且它起作用了。无需接触玩家、人类、机器人或棋盘模型。

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

【讨论】:

    猜你喜欢
    • 2014-02-20
    • 2013-09-17
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多