【问题标题】:Rails 3 has_one association: unlink associated object without destroying it?Rails 3 has_one 关联:取消链接关联对象而不破坏它?
【发布时间】:2014-05-06 15:47:04
【问题描述】:

我有两个班级,MasterSlaveMaster 类有一个slaveSlave 类属于master

给定两个关联对象master_aslave_a(其中slave_a 属于master_a),如何在不从数据库中破坏slave_a 的情况下取消它们的链接?我基本上需要“释放”slave_a。我试过master_a.slave.delete,它会从数据库中销毁slave_a

我也尝试过master_a.slave.update_attribute(:master_id, nil),但下次调用master_a.save 时,它会重新链接它们。这是否表明我忽略了一个回调(其中 Master 类有很多),还是我只是使用了错误的工具来完成这项工作?

编辑:我应该指定,我不想破坏任何一个对象,只想破坏这两个特定实例之间的链接。另外,真正的模型实际上并不称为主从模型,这只是我正在使用的一个说明性示例。

【问题讨论】:

  • 您能准确解释一下您要做什么吗?如果删除,那么 Austintacious 的解决方案将起作用

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


【解决方案1】:

这是因为masterslave 对象在内存中的保存方式。即使您更新了从属,主控仍然认为从属与它相关联,因为关联的从属对象仍然保存在内存中(这通常更有效)。当master重新加载时,关联就会消失。因此,如果您在控制台中执行此操作,您会期望看到如下内容:

master = Master.find(123)
=> <master object>
master.slave.update_attribute(:master_id, nil)
=> true
master.slave
=> <slave object>
master.reload 
OR
master = Master.find(123)
master.slave
=> nil

【讨论】:

  • 在调用master.save 之前,我通过同时执行master.slave.update_attribute(:master_id, nil)master.slave = nil 设法解决了这个问题。
猜你喜欢
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多