如何同时保存对象和关系?

时间:2012-08-27 16:16:31

标签: ruby-on-rails ruby-on-rails-3

Rails经常告诉我其他人在我遇到问题之前已经考虑过了,但这一次,我没有找到任何东西......

我有3个模型:NodeVolumeFilesystem(我使用Mongoid,但我认为问题与ActiveRecord相同)

节点has_many卷和文件系统;卷has_many文件系统。

我在相同的“节点”中定义卷和文件系统。表单(使用JS更新每个文件系统""卷"在添加/更改/删除卷时选择框)。这个表格很好。

在保存节点时尝试保留文件系统时存在问题:

由于新卷还没有任何ID,我在选择框中使用卷名作为值,但外键是ID(名称在节点中是唯一的,但不同的节点将具有卷同名,所以我不能使用名称作为ID。

nodes_controller的{​​{1}}和create操作中,我需要找到首先保存卷的解决方案,然后替换包含卷名的update各自的身份证。这非常脏,我想知道是否可以用干净的方式完成。

还有其他人有同样的问题吗?

唯一真正"清洁"解决方案是在不同的步骤中保存卷和文件系统,但我的应用程序确实需要"更少的点击更好"因为params[:node][:filesystems_attributes]包含许多其他嵌套模型(和表单)。

2 个答案:

答案 0 :(得分:1)

Nested Attributes似乎就是你要找的东西。将它们添加到您的Node模型中,您应该准备好了。

accepts_nested_attributes_for :volumes, :filesystems

如果您使用表单助手

<%= form.fields_for :nodes do |nodes_form| %>

是定义子属性的方法。

答案 1 :(得分:0)

我刚刚将Filesystem嵌套到Volume而不是Node中,它就像魅力一样。

糟糕的设计会产生不好的问题; o)