【问题标题】:Ember-data validation and associationsEmber 数据验证和关联
【发布时间】:2025-12-19 11:50:09
【问题描述】:

这对我来说似乎一遍又一遍地出现,我想要关于如何处理它的建议。请原谅我在coffeescript中编写示例。

App.Post = DS.Model.extend
    title: DS.attr('string')
    author: DS.belongsTo('App.Author')

App.Author = DS.Model.extend
    name: DS.attr('string')
    posts: DS.hasMany('App.Post')

我想同时创建一个作者和相关的帖子。

author = App.Author.createRecord({name: 'waldo'});

author.get('posts').createRecord({title: 'how to do the Ember'})

或者

post = App.Post.createRecord({author: author})

问题是,我服务器上的 Post 模型验证了 author_id 的存在。所以当我调用store.commit() 时,author 提交成功,但post 被拒绝,因为post.get('author.id') //=> undefined

更新:作者模型还在服务器上进行了验证,表明它需要至少创建一个帖子,因此我无法在创建帖子之前调用store.commit()

我处理交易失败。我会继续搞砸它,但这似乎是一个很好的问题,可以在 S/O 上回答以供将来参考。

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    您需要在交易中这样做吗?如果没有,您可以在将帖子记录添加到作者之前致电App.store.commit()。如果这不能解决您的问题,您可能会遇到异步问题。在这种情况下,您可以连接到您的作者模型上的didCreate-事件。当该事件触发时,记录已在服务器上创建,您的模型应该有一个 id。如果您在此阶段添加帖子,您的服务器不应该抱怨。

    【讨论】:

    • 我忘了提到我还有一个验证,说如果没有至少一个帖子就不能添加作者。 (这是一个伪示例,在我的应用程序中更有意义)。你能给我一个如何连接didCreate的例子吗?我知道该函数已被调用,但我不确定如何绑定到它,以便在调用它之后调用其他操作。
    • 链接文档中有一个关于 didLoad 的示例。只需将didload 替换为didCreate。也许您可以先创建Post,然后在提交后,您可以添加具有该帖子ID的作者?
    • 离线对话后,我想我真正想做的就是在 Rails 中接受嵌套属性。交易应该是全有或全无。 Author 和 post 都不应在没有对方的情况下保存。