我正在开发一个Rails应用程序,它通过:has_many through
关联在许多不同的表中拥有大量数据。这里的问题是这些关联不是静态的,就像典型的Post-User,Assembly - Part,Book - Author关联一样,它们会一直在变化。目标是找到管理数据库中现有对象之间关联的最有效方法。
正如我最近意识到的那样,Rails不会自动创建现有对象之间的关联,嵌套表单只有在已存在关联时才可用。
例如,我有一个从联系人表中加载Contact
的表单。相同的表单具有从命令表填充的Command
多选。我想将多个命令与此Contact
相关联,因此我在多选中选择了几个命令,将它们添加到名为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)
确定。那不是那么优雅......
模型验证听起来像是一个很好的选择,我会把它作为一个额外的安全措施,但为什么让应用程序做额外的工作?重复记录应在到达模型之前丢弃。
另一种可能性(我知道)是基本比较我的控制器中的数组,看看数据库中的数据与从表单中发布的内容之间的区别。
现在,我的观点是AngularJS,我还没弄清楚如何使Angular使用Rails _destroy
方法。如果那不可能,我将不得不进行另一个数组比较,现在反过来,看看需要删除哪些关联。再次,不是很优雅。
因此,虽然摧毁所有关联并重新建立它们的强力方法再次起作用并且需要的代码量最少,但我并不觉得这是很好的做法。
有关管理多个现有对象之间关联的更有效和最干净方法的建议吗?