<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Magic_0919 (Bye, RoR)</title>
    <link>https://ruby-china.org/Magic_0919</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>ApplicationRecord 对象之间是如何关联的？临时修改保存在哪里？谁能讲解一下</title>
      <description>&lt;p&gt;我有这么一个问题，采用嵌套表单接收了表单数据。按照 Rails 文档可以知道关联对象会自动建立 Record 对象，&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# class OrderController &amp;lt; BaseController&lt;/span&gt;
&lt;span class="vi"&gt;@order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Settlement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="vi"&gt;@order.assign_attributes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order_params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@order.update_actual_amount&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="vi"&gt;@order.save&lt;/span&gt;
  &lt;span class="n"&gt;redirect_to&lt;/span&gt; &lt;span class="n"&gt;order_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
  &lt;span class="n"&gt;redirect_to&lt;/span&gt; &lt;span class="ss"&gt;action: &lt;/span&gt;&lt;span class="s1"&gt;'edit'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Save 方法会更新 order 及其关联付款单对象 payment，update_actual_amount 则负责将各个 payment 的实际付款金额加和，保存到 order 对象中。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# class Order &amp;lt; ApplicationRecord&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_actual_amount&lt;/span&gt;
    &lt;span class="n"&gt;actual_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
    &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;payments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;payment&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;actual_amount&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actual_amount&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actual_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;actual_amount&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但实际情况是，上面对 actual_amount 的更新没有正确执行，因为获取到的 payment.actual_amount 是数据库查出来的旧数据，而我需要从表单接受来的“临时”数据&lt;/p&gt;

&lt;p&gt;也就是说，如果我的代码没错的话，order 在控制器中关联的 payment 是有修改的 Record 对象（不然不可能发生更新），但在执行内部方法时候关联的 payments 却是重新查询出来的新数据。&lt;/p&gt;

&lt;p&gt;为什么会发生这种情况？Record 之间的关联是怎么设计的？为什么会有这种设计？如果我需要完成上述功能，推荐的做法是什么？&lt;/p&gt;</description>
      <author>Magic_0919</author>
      <pubDate>Tue, 31 Jul 2018 11:01:09 +0800</pubDate>
      <link>https://ruby-china.org/topics/37254</link>
      <guid>https://ruby-china.org/topics/37254</guid>
    </item>
  </channel>
</rss>
