【问题标题】:when does the destroy action actually destroy the item?销毁操作何时真正销毁该项目?
【发布时间】:2015-03-03 13:03:08
【问题描述】:

在处理一个相当复杂的“更新队列中的某些项目”方法时,我需要依赖于在我销毁其中一个成员后集合长度会变短。

但是当我这样做时......

def destroy # destroying a unit_user
    @unit = @unituser.unit

    logger.info('----- queue length before destroy is ' + @unit.unit_users.length.to_s)

    if @unituser.destroy
      logger.info('---- queue length after destroy is ' + @unit.unit_users.length.to_s)

...记录器两次打印相同的值!

那么为什么,即使操作 确实 最终会破坏 unituser,但队列长度并没有像我预期的那样缩短?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您所看到的本质上是因为集合(在本例中为 @unit.unit_users 集合)已被缓存(这意味着,关联查询不会在您每次调用时重新执行)。解决此问题的一种方法是在销毁记录后“重新加载”模型。

    销毁记录后,只需这样做:

    @unit.reload
    

    这将重新执行最初加载 @unit 的原始查询。

    之后,您的 @unit.unit_users 集合此时应该显示不同的大小。

    更新

    我现在意识到,鉴于您的模型名称,看起来您在 UnitUser 模型之间存在多对多,并且连接模型称为 UnitUser。如果是这种情况,而您只是想删除关联,但保留 unit 和 user 对象,您可以这样做:

    @unit.unit_users.destroy(@some_user_object)
    

    【讨论】:

    • 但是当你销毁一个集合的成员时,我猜本地缓存的集合会更新?我已经很久没有接触 Rails 了,但我认为您不必每次删除某些内容时都重新加载(?)。
    • @Mörre 这取决于您实际要删除的内容。例如,如果您只想从多对多集合中删除一个对象,但希望两个对象都保留,那么您可以执行@unit.unit_users.destroy(@user) 之类的操作。如果单元和用户将保留,但 @unit.unit_users 集合将正确更新而无需重新加载。我现在实际上在想 OPs 场景实际上可能是一个 MM,所以我会添加它。但是,如果你完全销毁依赖对象并从集合中删除,我相信这是唯一的方法。
    • @Mörre 如果您或任何人发现表明我错了的东西,请务必告诉我。我不想给 OP 不正确的信息。还要记住,我认为这是一个奇怪的情况;在删除后基于关联集合大小的 RESTful 删除操作中执行某些操作可能有点奇怪,这可能是 XY 问题。
    • 我无法判断您是否正确,因为我不太了解 OP 问题,我错过了很多上下文 - 但是,正如我所说,我已经有一段时间没有使用导轨。
    • @unit.reload 效果很好 - 谢谢! ....另外,after_destroy 回调可能是完成我想要做的事情的最佳方式,但我也遇到了麻烦,想先让逻辑在控制器中工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多