<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>dudu_zzzz (JackM)</title>
    <link>https://ruby-china.org/dudu_zzzz</link>
    <description>字节跳动视频架构组</description>
    <language>en-us</language>
    <item>
      <title>Grape on Rails + Puma 线程安全性的讨论?</title>
      <description>&lt;p&gt;今天愉快的写 grape-api 时，忽然惊觉可能有线程安全问题！！我在 &lt;a href="https://github.com/ruby-grape/grape/issues/1334" rel="nofollow" target="_blank" title=""&gt;grape-issue&lt;/a&gt; 和 &lt;a href="https://github.com/puma/puma/issues/933" rel="nofollow" target="_blank" title=""&gt;puma-issue&lt;/a&gt; 都发现了类似的提问。&lt;/p&gt;

&lt;p&gt;根据 grape-issue 里的描述，他把服务器从 Unicorn 切换到 Puma 以后，发现 so much users get other users data from api。&lt;/p&gt;

&lt;p&gt;他的代码是这样&lt;/p&gt;

&lt;p&gt;base.rb&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;V3&lt;/span&gt;
  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Base&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Grape&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;API&lt;/span&gt; 
    &lt;span class="n"&gt;helpers&lt;/span&gt; &lt;span class="no"&gt;V3Helpers&lt;/span&gt;

    &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;V3&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Photos&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;p&gt;v3_helpers.rb&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;current_user&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="vi"&gt;@current_user&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;defined?&lt;/span&gt; &lt;span class="vi"&gt;@current_user&lt;/span&gt;

&lt;span class="vi"&gt;@current_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&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;:uid&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;photos.rb&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;V3&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Photos&lt;/span&gt;
    &lt;span class="kp"&gt;extend&lt;/span&gt; &lt;span class="no"&gt;ActiveSupport&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Concern&lt;/span&gt;

    &lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;

      &lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="ss"&gt;:photos&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; 
          &lt;span class="n"&gt;photos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Photo&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="n"&gt;photos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_json&lt;/span&gt; 
        &lt;span class="k"&gt;end&lt;/span&gt;   
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&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;p&gt;Base 的实例变量 &lt;code&gt;@current_user&lt;/code&gt; (我并不确定这个 &lt;code&gt;@current_user&lt;/code&gt; 是否是 &lt;code&gt;Base&lt;/code&gt; 的实例变量)，似乎是被并发干扰了，很像 Java Servelet 里的线程安全的问题。&lt;/p&gt;

&lt;p&gt;可我也正准备这么写呢，明明在 Rails 里这样用 &lt;code&gt;@current_user&lt;/code&gt; 就 ok 啊。&lt;/p&gt;

&lt;p&gt;我从 &lt;a href="https://bearmetal.eu/theden/how-do-i-know-whether-my-rails-app-is-thread-safe-or-not/" rel="nofollow" target="_blank" title=""&gt;How Do I Know Whether My Rails App Is Thread-safe or Not?&lt;/a&gt; 里找到了为什么 Rails 里这样用是 ok 的。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In general, Rails creates a new controller object of every HTTP request, and everything else flows from there.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;但是 Grape on Rails 里似乎是有线程安全问题的，那么如何解决呢？&lt;/p&gt;

&lt;p&gt;我的想法是像下面这样避免使用 Instance Variable, 不知是否正确。如果是错误的，那么正确的方式又是什么呢？&lt;/p&gt;

&lt;p&gt;v3_helpers.rb&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;current_user&lt;/span&gt;
  &lt;span class="no"&gt;User&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;:uid&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;photos.rb&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;V3&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Photos&lt;/span&gt;
    &lt;span class="kp"&gt;extend&lt;/span&gt; &lt;span class="no"&gt;ActiveSupport&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Concern&lt;/span&gt;

    &lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;

      &lt;span class="n"&gt;resources&lt;/span&gt; &lt;span class="ss"&gt;:photos&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; 
          &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_user&lt;/span&gt;
          &lt;span class="n"&gt;photos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Photo&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;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="n"&gt;photos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_json&lt;/span&gt; 
        &lt;span class="k"&gt;end&lt;/span&gt;   
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&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="PS: 实在是难以相信 Grape 和 Puma 一起用会有这么严重的问题啊，都不敢用 Grape 了。在生产环境使用过 Grape 的伙伴们有遇到过线程安全问题吗？"&gt;PS: 实在是难以相信 Grape 和 Puma 一起用会有这么严重的问题啊，都不敢用 Grape 了。在生产环境使用过 Grape 的伙伴们有遇到过线程安全问题吗？&lt;/h4&gt;</description>
      <author>dudu_zzzz</author>
      <pubDate>Wed, 01 Jun 2016 22:54:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/30188</link>
      <guid>https://ruby-china.org/topics/30188</guid>
    </item>
    <item>
      <title>同时需要 API 和 Web 页面的 Rails 项目，怎样结合 Grape 和 Rails？</title>
      <description>&lt;p&gt;问题是这样的，准备开发的应用会涉及 WEB 端和 APP 端，所以，打算用 Grape 做 api，rails 做 web 页面&lt;/p&gt;

&lt;p&gt;但是这样，是不是意味着同样的业务逻辑需要在 Grape 和 Rails 里分别写一遍？或者干脆 WEB 端也前后分离，直接调用 API？&lt;/p&gt;

&lt;p&gt;迷茫，有什么好的实践经验可以分享吗？&lt;/p&gt;</description>
      <author>dudu_zzzz</author>
      <pubDate>Fri, 15 Apr 2016 13:11:10 +0800</pubDate>
      <link>https://ruby-china.org/topics/29723</link>
      <guid>https://ruby-china.org/topics/29723</guid>
    </item>
    <item>
      <title>Rails 中 redis 与 mysql 不同配置方式引发的疑问</title>
      <description>&lt;p&gt;在用 redis.rb 配置 redis 的时候 大概都会有这么一句&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$redis = Redis.new(:host =&amp;gt; 'localhost', :port =&amp;gt; 6379, :db =&amp;gt; 10)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后所有需要使用 redis 的地方，只要用这个$redis 就可以了。&lt;/p&gt;

&lt;p&gt;我理解成，操作 redis 反反复复都只用了$redis 这一个连接，而对于一般关系型数据库往往使用连接池。&lt;/p&gt;

&lt;p&gt;为什么 redis 只需要使用这一个连接呢？是因为 redis 单线程的关系吗？&lt;/p&gt;</description>
      <author>dudu_zzzz</author>
      <pubDate>Fri, 19 Feb 2016 15:38:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/29035</link>
      <guid>https://ruby-china.org/topics/29035</guid>
    </item>
    <item>
      <title>Ruby 如何调用 Java 代码</title>
      <description>&lt;p&gt;mac 上在 Rails 里调用一段 Java 程序，想了想觉得有几种方式&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;把 java 程序封装成命令行，ruby 通过命令行调用（调用参数可能是复杂的对象，如何处理？）&lt;/li&gt;
&lt;li&gt;通过 socket 相互访问（对象序列化机制肯定有差异，ruby 序列化的对象，java 里能否反序列化回来？）&lt;/li&gt;
&lt;li&gt;soap（不太懂是怎么回事，通过 xml 来交互的？）&lt;/li&gt;
&lt;li&gt;java 封装一个 http service（还要开个 tomcat 之类，觉得太重量了）&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;想问问社区的前辈们应该怎么选择，或者有其他更好的方式？&lt;/p&gt;</description>
      <author>dudu_zzzz</author>
      <pubDate>Wed, 27 Jan 2016 22:23:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/28889</link>
      <guid>https://ruby-china.org/topics/28889</guid>
    </item>
    <item>
      <title>Rails 程序员如何进阶？</title>
      <description>&lt;p&gt;小白一枚，先介绍一下自己的情况。&lt;/p&gt;

&lt;p&gt;进行 rails 相关的工作也半年了（实习），中间参考着 wiki 学习的阶段略去不提，到现在觉得 rails 的 api 都挺熟悉了，也使用过了一些主流 gem，体会到 redis，postgresql 的甜头了，知道用 Rspec 测试自己的代码，也自己在 vps 上折腾折腾部署的东西。&lt;/p&gt;

&lt;p&gt;但是却越来越迷茫，感觉能学到的东西越来越少，学习新知识的速度明显没有以前那么快了，编写一些业务逻辑上的代码真的感觉不到提升。&lt;/p&gt;

&lt;p&gt;看了&lt;a href="https://ruby-china.org/topics/19375" title=""&gt;怎样成为一个优秀的初级开发者&lt;/a&gt;之后还是迷茫&lt;/p&gt;

&lt;p&gt;过了入门阶段后，接下来的道路是什么样的？需要继续学习哪些方面的知识？需要积累什么样的经验？&lt;/p&gt;</description>
      <author>dudu_zzzz</author>
      <pubDate>Mon, 11 Jan 2016 14:16:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/28683</link>
      <guid>https://ruby-china.org/topics/28683</guid>
    </item>
    <item>
      <title>Rails 连接不同数据库的问题</title>
      <description>&lt;p&gt;有一个 rake 脚本，用来从 mysql 读数据，写入 postgres 里&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:whole_group&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:environment&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;groups&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"%Y-%m-%d %H:%M:%S"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
              &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;establish_connection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"PG_&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;connection&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt; &lt;span class="s2"&gt;"insert into pg_group_records (group_id, data, created_at) values &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;","&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;;"&lt;/span&gt;
    &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样的确是可以工作的，但是我写 testcase 遇到了奇怪的问题。&lt;/p&gt;

&lt;p&gt;before 里先往 pg 里导入一些数据，然后这个 controller 从 postgres 里读一些数据做处理&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="no"&gt;Redis&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="nf"&gt;flushall&lt;/span&gt;
    &lt;span class="no"&gt;Rake&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'transfer_data:whole_group'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;  &lt;span class="c1"&gt;#运行上面那个rake脚本&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s2"&gt;"transfer whole group"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="ss"&gt;:index&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="no"&gt;Minion&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;GroupRecord&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt;
  &lt;span class="vi"&gt;@posts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt;&lt;span class="o"&gt;....&lt;/span&gt; &lt;span class="c1"&gt;#一些查询逻辑&lt;/span&gt;
  &lt;span class="vi"&gt;@groups&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt; &lt;span class="s2"&gt;"HOT_GROUPS_&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_i&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;days&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;hot_groups&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;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/53877814ceceeb5e9e32b86cf35918dc.png" title="" alt=""&gt;
post 表存在于 mysql 中，为什么会去从 postgres 里找呢？ &lt;/p&gt;

&lt;p&gt;我觉得是 rake 脚本中 establish_connection 带来的影响，查阅了一下没有什么发现。&lt;/p&gt;

&lt;p&gt;那么什么才是 rails 中正确的连接多个数据库的方法呢？连接之后要做怎样的处理呢？&lt;/p&gt;</description>
      <author>dudu_zzzz</author>
      <pubDate>Wed, 09 Dec 2015 11:32:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/28320</link>
      <guid>https://ruby-china.org/topics/28320</guid>
    </item>
    <item>
      <title>after_save 回调被多次调用的问题</title>
      <description>&lt;p&gt;写了一个 Reindex module 代码如下，功能就是在 ActiveRecord 对象 save 时，异步创建索引&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module Reindex
  def async_reindex
    AsyncIndexJob.perform_later(self.class.to_s, self.id)
  end

  def self.included(base)
    base.class_eval do
       base.send :after_save ,:async_reindex
    end
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;测试代码&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;require 'rails_helper'

RSpec.describe AsyncIndexJob, type: :job do
  include ActiveJob::TestHelper
    describe "AsyncIndexJob" do
      it "should enqueue" do
        group = Group.create(……)
        expect(enqueued_jobs.size).to eq(1)
    end
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是结果非常奇怪，queue 的 size 是 3，也就是 after_save 被调用了 3 次，为什么会这样呢？&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Failures:

  1) AsyncIndexJob AsyncIndexJob should enqueue
     Failure/Error: expect(enqueued_jobs.size).to eq(1)

       expected: 1
            got: 3

&lt;/code&gt;&lt;/pre&gt;</description>
      <author>dudu_zzzz</author>
      <pubDate>Mon, 09 Nov 2015 13:51:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/27997</link>
      <guid>https://ruby-china.org/topics/27997</guid>
    </item>
    <item>
      <title>Ruby 的年龄计算</title>
      <description>&lt;p&gt;today = Date.today
birth = date_of_birth（date_of_birth 也是一个 Date）&lt;/p&gt;

&lt;p&gt;想要精确计算出年龄  x 岁 x 月 x 天 &lt;/p&gt;

&lt;p&gt;各位前辈们有什么好的方法么？&lt;/p&gt;</description>
      <author>dudu_zzzz</author>
      <pubDate>Tue, 13 Oct 2015 12:28:20 +0800</pubDate>
      <link>https://ruby-china.org/topics/27652</link>
      <guid>https://ruby-china.org/topics/27652</guid>
    </item>
  </channel>
</rss>
