【问题标题】:Can you force activerecord associations to update without saving them?您可以强制 activerecord 关联更新而不保存它们吗?
【发布时间】:2009-04-02 00:08:01
【问题描述】:

我有几个模型与 has_many belongs_to 对相关联。为了演示,一个客户端有一个服务器,但一个服务器有很多客户端。我可能会这样做:

client1.server = the_server
client2.server = the_server
client3.server = the_server

我的实际应用程序比这要复杂得多,但该示例将用于说明。

我想在保存这些对象之前检查它们之间的关联。 ActiveRecord 在保存之前不会更新他们的信息。在上面的示例中,the_server 不知道 client1client2client3 是谁,直到其中一个被保存。我确信这有助于提高 active_record 的效率,但它会使内存中的模型实例处于不一致的状态。

我可以在客户端或服务器上调用什么东西来更新它们的状态吗?

【问题讨论】:

  • 三年半后,我也遇到了同样的问题,但在我的情况下,模型可能会变得不一致。有什么要补充的吗?

标签: ruby-on-rails activerecord has-many belongs-to


【解决方案1】:

在对象上调用#reload 以更新它们。

【讨论】:

  • 这需要先保存对象不是吗? reload 说再次从数据库中获取信息。如果客户端 1、2 和 3 未保存,则无需重新加载。
  • 这也是我的理解。我不想从数据库中刷新——恰恰相反:我希望对象像被保存一样刷新。
  • 这是一个巨大的反模式,表明建模存在问题。如果您希望对象重新加载关联对象,请使用clear_association_cache,因为当前关联已过时。重新加载本身有时会创建无限循环,并且往往会在一个请求中被调用 5 次,因为“您只是不确定”对象是否已重新加载,具体取决于您当前在代码中的控制器/模型
  • -1 因为 OP 要求提供一种无需保存到数据库即可工作的解决方案。 #reload 仅在数据保存到数据库时才有意义。
【解决方案2】:

如果你是这样开始的:

client1 = the_server.clients.build(:name => 'a client', ...)

那么我认为你应该得到你想要的东西。

编辑:

糟糕,我重新阅读了您的帖子,发现the_server 也尚未保存。在那种情况下,也许:

client1.server = the_server
the_server.clients << client1

(请注意,如果 the_server 已经保存,这将保存 client1)

或:

the_server.clients.build(:name => 'some client', ..., :server => the_server)

有点多余,所以也许有更好的方法。

【讨论】:

    【解决方案3】:

    如果您使用相反的方式创建关联,那么您可以在保存模型之前查看模型:

    the_server.clients << client1
    the_server.clients << client2
    the_server.clients << client3
    

    但是请注意,如果the_server 已经存在,您只能在之后立即调用client1.server

    【讨论】:

      猜你喜欢
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多