Ruby on rails 管理对象关联的有效方法

Ruby on rails 管理对象关联的有效方法,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在开发一个Rails应用程序,它在许多不同的表中包含大量数据,这些数据通过以下方式相互关联:has_many through associations。这里的问题是,这些关联不是静态的,就像典型的后用户关联、组装件关联、书籍作者关联一样,它们会一直变化。目标是找到最有效的方法来管理数据库中现有对象之间的关联 正如我最近意识到的,Rails不会自动在现有对象之间创建关联,而嵌套表单只有在关联已经存在时才可用 例如,我有一个从contacts表加载联系人的表单。同一表单有一个从命令表填充的命令多

我正在开发一个Rails应用程序,它在许多不同的表中包含大量数据,这些数据通过以下方式相互关联:has_many through associations。这里的问题是,这些关联不是静态的,就像典型的后用户关联、组装件关联、书籍作者关联一样,它们会一直变化。目标是找到最有效的方法来管理数据库中现有对象之间的关联

正如我最近意识到的,Rails不会自动在现有对象之间创建关联,而嵌套表单只有在关联已经存在时才可用

例如,我有一个从contacts表加载联系人的表单。同一表单有一个从命令表填充的命令多选。我想将多个命令与此联系人关联,因此我在multi-select中选择了几个命令,这将它们添加到名为notification_commands的数组中。由于Rails不进行自动关联,因此我必须执行以下操作:

contact = Contact.find_by_id params[:id]
commands = params[:contact][:notification_commands].collect { |c| c[:id] }
contact.commands << Command.find(commands)
这个很好用。。。除非,比方说,我想将另一个命令与此联系人关联。在这种情况下,现有的关联记录最终会被复制并添加新的关联记录。好的,我可以在我的模型中进行唯一的验证。。。或者我可以使用暴力,摧毁所有关联,然后重新建立它们

contact = Contact.find_by_id params[:id]
commands = params[:contact][:notification_commands].collect { |c| c[:id] }
contact.commands.destroy_all
contact.commands << Command.find(commands)
嗯。这并不是很优雅

模型验证在这里听起来是一个不错的选择,我将把它作为一个额外的安全措施,但是为什么要让应用程序做额外的工作呢?重复的记录在到达模型之前应该被丢弃

我知道的另一种可能性是基本上比较控制器中的数组,看看db中的数据和表单中发布的数据之间有什么区别

现在,我的视图是AngularJS,我还没有弄清楚如何使用Rails销毁方法来创建AngularJS。如果这不可能,我将不得不进行另一个数组比较,现在是相反的,以查看需要删除哪些关联。再说一次,不是很优雅

因此,虽然销毁所有关联并重新建立它们的暴力方法可以工作,并且需要最少的代码,但我认为这不是一个好的实践


关于管理多个现有对象之间的关联的最有效和最干净的方法有什么建议吗?

完全不相关,但请注意,commands=params[:contact][:notification_commands].collect{c}c[:id]}可以表示为commands=params[:contact][:notification_commands]。collect&:id.@DaveNewton:谢谢,戴夫。真的很感激指针!我总是想办法让事情变得更干净,这是肯定的helps@DaveNewton:那不行,顺便说一句,我明白了。这就是为什么我必须首先使用c[:id]和c.id。哦,对了,这是一个散列-对不起!