<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>netqyq (yongqiang)</title>
    <link>https://ruby-china.org/netqyq</link>
    <description>归根结底，各种语言的设计思路和特性体现的是其作者对事物及其关系通过逻辑表示的思考与探索。</description>
    <language>en-us</language>
    <item>
      <title>分布式管理进程/任务用什么工具好？</title>
      <description>&lt;p&gt;大家好。&lt;/p&gt;

&lt;p&gt;我有一个在单机（Ubuntu/Linux）上执行的很好的程序（Go 编译后的二进制文件，主要来处理数据，处理结果存入数据库，可以并行处理），现在我现在想在多台机器上同时执行这个程序，各个进程不交互，互不影响。请问有没有什么工具可以集中管理这种多台机器上的进程，监视运行状态什么的？&lt;/p&gt;

&lt;p&gt;需求总结：管理多台机器，每台机器运行多个同样的进程 (dosomething)。&lt;/p&gt;

&lt;p&gt;内心：不太想使用 Docker 生态系统的东西。越是原始、底层、简单、有效，越好！。&lt;/p&gt;</description>
      <author>netqyq</author>
      <pubDate>Sun, 13 Aug 2023 11:28:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/43274</link>
      <guid>https://ruby-china.org/topics/43274</guid>
    </item>
    <item>
      <title>有没有好用的百科网站推荐？</title>
      <description>&lt;p&gt;最近在给 &lt;a href="https://backdata.net/" rel="nofollow" target="_blank" title=""&gt;Backdata.net&lt;/a&gt; 抓数据，需要收录高质量百科网站。维基百科不收录，因为国内无法访问。其他的百度百科，搜狗百科不允许抓取，内容越来越割裂了。大家有没有好用的百科网站推荐？&lt;/p&gt;</description>
      <author>netqyq</author>
      <pubDate>Fri, 04 Aug 2023 18:25:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/43253</link>
      <guid>https://ruby-china.org/topics/43253</guid>
    </item>
    <item>
      <title>征集一些优秀的技术团队博客 (国内外都需要)</title>
      <description>&lt;p&gt;想征集一些优秀的技术团队博客，放在一起，方便学习查阅，大家有没有推荐的，可以在下方评论。&lt;/p&gt;

&lt;p&gt;打算将它们集中放在 &lt;a href="https://cooltools.top/developers.html" rel="nofollow" target="_blank"&gt;https://cooltools.top/developers.html&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;目前已经收录有：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spotify R&amp;amp;D&lt;/li&gt;
&lt;li&gt;美团技术团队&lt;/li&gt;
&lt;li&gt;小米信息部技术团队&lt;/li&gt;
&lt;li&gt;Thoughtworks 洞见&lt;/li&gt;
&lt;li&gt;Twitter Engineering&lt;/li&gt;
&lt;li&gt;Meta Engineering&lt;/li&gt;
&lt;li&gt;netflix tech blog&lt;/li&gt;
&lt;li&gt;airbnb Engineering&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>netqyq</author>
      <pubDate>Mon, 12 Jun 2023 16:36:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/43168</link>
      <guid>https://ruby-china.org/topics/43168</guid>
    </item>
    <item>
      <title>我们做了一个 AI 导航网站（AI 工具集合）Cooltools.top/ai.html</title>
      <description>&lt;p&gt;大家好，看最近大家对 AI 应用关注比较多，我们做了一个 AI 网址导航网站：&lt;a href="https://CoolTools.top/ai.html" rel="nofollow" target="_blank"&gt;https://CoolTools.top/ai.html&lt;/a&gt; ，这里面包含有聊天问答，文案生成，阅读辅助，图片生成，图片处理，语音生成，品牌 logo 设计，视频生成，市场营销，法律等相关的 AI 网站，一共超过了 300 个。欢迎使用，希望对大家有所帮助，期待大家能提出反馈意见建议，非常感谢。 &lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/netqyq/c3931170-2a29-48f5-9e62-7b61a4c1cdf1.png!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/netqyq/e7197d84-c159-4353-9b83-98a7c15655ae.png!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/netqyq/33179026-4efa-497a-84b6-87f74bf16edc.png!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/netqyq/b632c551-fdda-485e-8c49-8ea74cb1e6f6.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>netqyq</author>
      <pubDate>Mon, 15 May 2023 18:38:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/43077</link>
      <guid>https://ruby-china.org/topics/43077</guid>
    </item>
    <item>
      <title>记一次 capistrano 异常及其引发的思考</title>
      <description>&lt;h4 id="缘起"&gt;缘起&lt;/h4&gt;
&lt;p&gt;记得上一次线上部署是 3 月 29 日，使用&lt;code&gt;cap production deploy&lt;/code&gt;，没有什么问题，顺利部署。&lt;/p&gt;

&lt;p&gt;今天跟新了几行代码，没动 capistrano 相关的部分，执行部署命令，居然直接 abort 异常退出了！百思不得其解。&lt;/p&gt;

&lt;p&gt;报错如下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(Backtrace restricted to imported tasks)
cap aborted!
Don't know how to build task 'start' (see --tasks)

Tasks: TOP =&amp;gt; production
(See full trace by running task with --trace)
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="找原因"&gt;找原因&lt;/h4&gt;
&lt;p&gt;加上&lt;code&gt;--trace&lt;/code&gt;看了一下，没找到明显的提示。&lt;/p&gt;

&lt;p&gt;只好祭出 google 了。搜索一下关键字，看了几条结果，好像不搭边。再精确提炼一下关键字。&lt;/p&gt;

&lt;p&gt;从报错中提取一行关键信息，&lt;code&gt;Don't know how to build task 'start' (see --tasks)&lt;/code&gt;，去掉后面的&lt;code&gt;(see --tasks)&lt;/code&gt;，因为原则上尽量不要给搜索引擎增加处理特殊符号的负担，再加上主题词&lt;code&gt;capistrano&lt;/code&gt;, 因为主要是它的问题。&lt;/p&gt;

&lt;p&gt;最终的搜索关键字如下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;capistrano Don't know how to build task 'start'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样的话问题逻辑上就会被限定死。如果这样没有结果，搜索这条路子就至此了。&lt;/p&gt;

&lt;p&gt;果然，看到第三条，还是&lt;a href="http://stackoverflow.com/questions/43014993/dont-know-how-to-build-task-start-when-run-cap-production-deploy-for-capist" rel="nofollow" target="_blank" title=""&gt;stackoverflow&lt;/a&gt;，有人说了&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add install_plugin Capistrano::Puma into your Capfile after require 'capistrano/puma'.

capistrano3-puma moved to 3.0 a few days ago. This line is required for loading default puma tasks in this version.

See https://github.com/seuros/capistrano-puma#usage
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="解决方法"&gt;解决方法&lt;/h4&gt;
&lt;p&gt;特别是再看到&lt;code&gt;moved ... a few days ago&lt;/code&gt;时，心中一阵喜感，觉得有希望了。&lt;/p&gt;

&lt;p&gt;试一下再 Capfile 中加入&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;install_plugin Capistrano::Puma
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行&lt;code&gt;bundle&lt;/code&gt;后，再运行部署命令就正常了。&lt;/p&gt;
&lt;h4 id="总结思考"&gt;总结思考&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;搜索时关键字选取很重要。
尽量去除一些介词、连词、语气词，去除特殊符号。因为在后台处理时这些也是要先去掉的，加上以后反而会给搜索引擎增加负担，从而降低准确率，不如我们先人工过滤一遍。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;如何避免类似事件？
考虑真正的原因，本地相关代码都没动，唯一动的就是执行了几遍&lt;code&gt;bundle&lt;/code&gt;命令，这样应该会把相关库一些最新代码同步下来，而配置没有自动同步下来，引发错误。由于这里 gem 中没有指定版本，这样的话会是使用最新的吧。&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;没注意到 Capistrano::Puma 的更新，没有跟上社区脚步。&lt;/p&gt;</description>
      <author>netqyq</author>
      <pubDate>Wed, 05 Apr 2017 19:23:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/32698</link>
      <guid>https://ruby-china.org/topics/32698</guid>
    </item>
    <item>
      <title>在有多个模型关联操作的情况下，使用 Callbacks 保证数据的一致性</title>
      <description>&lt;h4 id="背景"&gt;背景&lt;/h4&gt;
&lt;p&gt;通过 callback 关联的 2 个 model，rails 会自动把所有的数据库操作语句封装为一个事务。如果整个事务执行过程中有异常抛出，事务将自动回滚，从而保证了关联模型的数据一致性。&lt;/p&gt;
&lt;h4 id="举例"&gt;举例&lt;/h4&gt;
&lt;p&gt;在电商系统中，有 2 个模型，Order 和 OrderItem。其中 Order 模型用来存储订单信息，OrderItem 存储订单项。这 2 个表都有一个&lt;code&gt;orderID字段&lt;/code&gt;，通过一个生成的&lt;code&gt;orderID&lt;/code&gt;来进行关联，&lt;strong&gt;注意这里的&lt;code&gt;orderID&lt;/code&gt;并不是 ActiveRecord 自动维护的 order.id 或 order_item.id&lt;/strong&gt;，而是后生成的并且同时插入这 2 个表中，也就是说关联关系并没有用到原来的&lt;code&gt;id&lt;/code&gt;字段。所以不能通过 has_many 关联。&lt;/p&gt;

&lt;p&gt;数据库 schema 如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;create_table&lt;/span&gt; &lt;span class="s2"&gt;"order_items"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;force: :cascade&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;t&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;   &lt;span class="s2"&gt;"orderID"&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;integer&lt;/span&gt;  &lt;span class="s2"&gt;"product_id"&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decimal&lt;/span&gt;  &lt;span class="s2"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="ss"&gt;precision: &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;scale: &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decimal&lt;/span&gt;  &lt;span class="s2"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="ss"&gt;precision: &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;scale: &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;datetime&lt;/span&gt; &lt;span class="s2"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                          &lt;span class="ss"&gt;null: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;datetime&lt;/span&gt; &lt;span class="s2"&gt;"updated_at"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                          &lt;span class="ss"&gt;null: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;integer&lt;/span&gt;  &lt;span class="s2"&gt;"user_id"&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"product_id"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s2"&gt;"index_order_items_on_product_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;using: :btree&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;create_table&lt;/span&gt; &lt;span class="s2"&gt;"orders"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;force: :cascade&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;t&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;integer&lt;/span&gt;  &lt;span class="s2"&gt;"user_id"&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;   &lt;span class="s2"&gt;"orderID"&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;     &lt;span class="s2"&gt;"message"&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;datetime&lt;/span&gt; &lt;span class="s2"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                             &lt;span class="ss"&gt;null: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;datetime&lt;/span&gt; &lt;span class="s2"&gt;"updated_at"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                             &lt;span class="ss"&gt;null: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;   &lt;span class="s2"&gt;"fixed_address"&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decimal&lt;/span&gt;  &lt;span class="s2"&gt;"total_price"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="ss"&gt;precision: &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;scale: &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;index&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s2"&gt;"index_orders_on_user_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;using: :btree&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;业务逻辑是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;如果创建了订单，则需要将购物车中具体购买的物品添加到 order_items 表中。&lt;/li&gt;
&lt;li&gt;如果删除订单，则需要同时删除在 order_items 表中具有和 orderID 相同的项目。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;使用 Callback 实现关联操作如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&lt;/span&gt;
  &lt;span class="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:user&lt;/span&gt;
  &lt;span class="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:address&lt;/span&gt;

  &lt;span class="c1"&gt;# 新建order后新建order_items&lt;/span&gt;
  &lt;span class="n"&gt;after_create&lt;/span&gt; &lt;span class="ss"&gt;:create_order_items&lt;/span&gt;

  &lt;span class="c1"&gt;# 如果删除订单，则需要同时删除在order_items表中具有和orderID相同的项目。&lt;/span&gt;
  &lt;span class="n"&gt;after_destroy&lt;/span&gt; &lt;span class="ss"&gt;:destroy_all_same_orderID&lt;/span&gt;

  &lt;span class="kp"&gt;protected&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_order_items&lt;/span&gt;
      &lt;span class="n"&gt;current_user&lt;/span&gt; &lt;span class="o"&gt;=&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;user&lt;/span&gt;
      &lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;carts&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;cart&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="no"&gt;OrderItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;user_id: &lt;/span&gt;&lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;orderID: &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;orderID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;product_id: &lt;/span&gt;&lt;span class="n"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;product_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;price: &lt;/span&gt;&lt;span class="n"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;price&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;amount: &lt;/span&gt;&lt;span class="n"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;save!&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
      &lt;span class="c1"&gt;# raise "crash for test"&lt;/span&gt;
      &lt;span class="no"&gt;Cart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;user_id: &lt;/span&gt;&lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;destroy_all&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;destroy_all_same_orderID&lt;/span&gt;
      &lt;span class="c1"&gt;# raise "error"&lt;/span&gt;

      &lt;span class="no"&gt;OrderItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;orderID: &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;orderID&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;destroy_all&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="结论"&gt;结论&lt;/h4&gt;
&lt;p&gt;这样在 orders_controller.rb 中的 create 操作，只进行 order 新建相关的操作，没有任何 order_items 相关的操作。如果不使用 callback，在 controller 中操作两个模型的话，代码会不整洁，最主要是数据一直性无法保证。
另外，好的做法是将 callback 方法放在 private 或 protected 中，以避免对外公开。&lt;/p&gt;</description>
      <author>netqyq</author>
      <pubDate>Tue, 28 Feb 2017 18:13:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/32407</link>
      <guid>https://ruby-china.org/topics/32407</guid>
    </item>
    <item>
      <title>通配路由过期 warning</title>
      <description>&lt;h4 id="Warning："&gt;Warning：&lt;/h4&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DEPRECATION WARNING: Using a dynamic :controller segment in a route is deprecated and will be removed in Rails 5.1. (called from block
DEPRECATION WARNING: Using a dynamic :action segment in a route is deprecated and will be removed in Rails 5.1. (called from block in
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="路由配置:"&gt;路由配置：&lt;/h4&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;match ':controller(/:action(/:id(.:format)))', :via =&amp;gt; [:get, :post]

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请问如何处理？或者为什么会这样，其背后的道理是什么，有什么好的处理方式吗？&lt;/p&gt;</description>
      <author>netqyq</author>
      <pubDate>Fri, 15 Jul 2016 10:46:23 +0800</pubDate>
      <link>https://ruby-china.org/topics/30536</link>
      <guid>https://ruby-china.org/topics/30536</guid>
    </item>
  </channel>
</rss>
