子项不存在时保存父对象时的子关联错误(在内存中)

时间:2014-08-19 03:11:56

标签: ruby-on-rails

On Rails 4.1.1。

我有一个模型User和一个模型Comment(示例模型)。

User has_many :comments

拿这个控制器代码:

@user = User.find(1)
@user.comments.new({ body: "Hello World!" })
@user.save

这会导致我的用户对象出现验证错误,因为该注释尚未持久保存到数据库中。

我有一种情况,我不希望comment持久存储到数据库,但存在于内存中,以便@user.comments在我的视图中显示额外的“记录”,但实际上并不存在(作为预览)。

现在我只是从控制器中的数组中删除条目,但我想通过使用更全局的方法(可能在before_save挂钩中)来防止这些错误在将来发生。

这是一个常见问题吗?我是否经历过一种不是“轨道式”的设计模式?

1 个答案:

答案 0 :(得分:0)

将孩子与父母一起保存..您的父模型应该有accepts_nested_attributes_for

在user.rb

accepted_nested_attributes_for:comments

请注意:对于使用#accepts_nested_attributes_for的每个关联,都会自动启用:自动保存选项。

所以现在..你可以很容易地添加/更新父母/孩子

params = { member: { name: 'Jack', avatar_attributes: { icon: 'smiling' } } }
member = Member.create(params[:member])
member.avatar.id # => 2
member.avatar.icon # => 'smiling'

它还允许您通过成员更新头像:

params = { member: { avatar_attributes: { id: '2', icon: 'sad' } } }
member.update params[:member]
member.avatar.icon # => 'sad'