如何使用 Ember 的活动模型适配器和 Rails 的活动模型序列化程序正确设置单 table 继承结构?
How do I properly set up a single-table inheritance structure using Ember's Active Model Adapter and Rails' Active Model Serializer?
我正在创建一个棋盘游戏,其中有人类玩家和机器人玩家,两种类型都存储在 players
table 和 type
列中。每个玩家都有自己的棋盘。
我有一个 Rails API 使用活动模型序列化程序 gem。
我的 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')
总是 returns undefined
。我也试过从商店单独取回板子,但是 player_id
在板上,而不是相反。
谁能帮我弄清楚如何正确配置我的 AMS 序列化程序和 Ember 模型?
我最终将人类和机器人视为他们自己的模型,因为我永远不会在 Ember 应用程序中真正调用 game.get('players')
这个并且它起作用了。不必接触玩家、人类、机器人或棋盘模型。
// game.js
export default DS.Model.extend({
human: DS.belongsTo('human', {async: true}),
bot: DS.belongsTo('bot', {async: true})
});
我正在创建一个棋盘游戏,其中有人类玩家和机器人玩家,两种类型都存储在 players
table 和 type
列中。每个玩家都有自己的棋盘。
我有一个 Rails API 使用活动模型序列化程序 gem。 我的 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')
总是 returns undefined
。我也试过从商店单独取回板子,但是 player_id
在板上,而不是相反。
谁能帮我弄清楚如何正确配置我的 AMS 序列化程序和 Ember 模型?
我最终将人类和机器人视为他们自己的模型,因为我永远不会在 Ember 应用程序中真正调用 game.get('players')
这个并且它起作用了。不必接触玩家、人类、机器人或棋盘模型。
// game.js
export default DS.Model.extend({
human: DS.belongsTo('human', {async: true}),
bot: DS.belongsTo('bot', {async: true})
});