【问题标题】:Rails: Updating an object referenced via different association pathsRails:更新通过不同关联路径引用的对象
【发布时间】:2010-05-21 05:32:10
【问题描述】:

我有一个 User 对象,它通过两个不同的关联路径与 Post 对象相关:

  • Post --(has_many)--> cmets --(belongs to)--> writer(用户类型)
  • 帖子--(属于)--> 作家(用户类型)

说出以下保持:

user1.name == "Bill"
post1.comments[1].writer == user1
post1.writer == user1

现在,当我从数据库中检索 post1 及其 cmets 并像这样更新 post1.cmets[1].writer 时:

post1.comments[1].writer.name = "John"

我希望 post1.writer 也等于“John”。但事实并非如此!它仍然等于“比尔”。

所以似乎有一些缓存正在进行,但我没想到会发生这种情况。我希望 Rails 足够聪明,可以准确地加载一个名为“Bill”的用户实例;相反,它似乎加载了两个单独的:每个关联路径一个。

有人能解释一下这究竟是如何工作的,以及我如何以“Rails 方式”处理这些类型的情况吗? [编辑] 我真的应该像 Slobodan 的解决方案所建议的那样在我的代码中乱扔 reload 语句吗?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    Rails 不会“只加载一个用户实例”。评论作者和帖子作者是分开的。您必须保存更改并重新加载帖子。

    【讨论】:

    • 好的。这对我来说很痛苦,因为我正在有条件地更新该名称作为事件的结果(例如评论中的 before_destroy)。由于这与使用 post1.writer 的代码相当分离,我该如何优雅地做到这一点(=不要用 reload 语句乱扔我的代码,以防万一......)?
    • 如果您要销毁评论,只需执行销毁,然后重定向到实际重新加载记录的其他页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    相关资源
    最近更新 更多