【发布时间】:2011-12-21 01:40:23
【问题描述】:
假设我有一个 ModelA 实例,它可以“拥有许多”ModelB 实例。给定服务器上已经存在的 ModelB 记录的 id,如何将模型 A 与模型 B 关联? (API 文档只展示了如何通过同时创建新的模型 B 实例和数据库记录来做到这一点。)
例如,假设我有一个应用程序,可以使用 Person 和 Meeting 对象安排会议。服务器可能会像这样为会议返回 JSON:
会议:
{
id: '10',
purpose: 'Code review',
time: <timestamp>,
attendees: [ 501, 532 ]
}
人物:
{ id: 501, name: 'Kermit', email: 'kermit@thefrog.com' }
模型可以这样定义:
Ext.define('Person', {
extend: 'Ext.data.Model',
fields: ['id', 'name', 'email'],
proxy: {
type: 'rest',
url : 'data/people',
reader: { type: 'json' }
}
});
Ext.define('Meeting', {
extend: 'Ext.data.Model',
fields: ['id', 'purpose', 'time'],
hasMany: { model: 'Person', name: 'attendees' }
proxy: {
type: 'rest',
url : 'data/meetings',
reader: { type: 'json' }
}
});
我知道一旦加载了会议。我可以调用 meeting.attendees() 来访问每个 Person 模型。但是,给定新的与会者 ID(例如 599),我如何将另一个人添加到会议中?是为 id 599 加载 Person 实例然后将该实例添加到“参加者”的唯一选择吗,像这样?
Meeting.load(10, {
success: function(meeting) {
Person.load(599, {
success: function(person) {
meeting.attendees().add(person);
meeting.save();
}
});
}
})
当 meeting.save() 运行时,POST 是否正确地只包含此人的 ID,像这样?
{
id: '10',
purpose: 'Code review',
time: <timestamp>,
attendees: [ 501, 532, 599 ] <-- '599' is new attendee
}
谢谢!
【问题讨论】:
-
您可能应该为此使用多对多关系,因为一个人可以参加很多会议,而会议可以有很多人。 id 的列表、数组等是一件坏事。
-
感谢您的意见。也就是说,这只是一个简单的类比。实际上,关联是真正的一对多,并且数据库 (MongoDB) 的首选方法是不使用 ID 数组。但重点。
-
这是一篇关于为使 EXT JS 4 更好地处理文档数据库所做的工作的文章。 sencha.com/forum/…我使用的是 Sencha Touch 的补丁版本和 CouchDB。