<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>tianlitao (田力涛)</title>
    <link>https://ruby-china.org/tianlitao</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Passenger + Nginx 程序运行一段时间报错，没有找到具体的原因，求教</title>
      <description>&lt;p&gt;production.log 日志&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;ConnectionTimeoutError&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;could&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;obtain&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;within&lt;/span&gt; &lt;span class="mf"&gt;5.000&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;waited&lt;/span&gt; &lt;span class="mf"&gt;5.000&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
  &lt;span class="n"&gt;activerecord&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;4.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;active_record&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;connection_adapters&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;abstract&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;connection_pool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="ss"&gt;:in&lt;/span&gt; &lt;span class="sb"&gt;`block in wait_poll'
  activerecord (4.1.7) lib/active_record/connection_adapters/abstract/connection_pool.rb:181:in `&lt;/span&gt;&lt;span class="kp"&gt;loop&lt;/span&gt;&lt;span class="s1"&gt;'
  activerecord (4.1.7) lib/active_record/connection_adapters/abstract/connection_pool.rb:181:in `wait_poll'&lt;/span&gt;
  &lt;span class="n"&gt;activerecord&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;4.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;active_record&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;connection_adapters&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;abstract&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;connection_pool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;136&lt;/span&gt;&lt;span class="ss"&gt;:in&lt;/span&gt; &lt;span class="sb"&gt;`block in poll'
  /usr/local/rvm/rubies/ruby-2.0.0-p643/lib/ruby/2.0.0/monitor.rb:211:in `&lt;/span&gt;&lt;span class="n"&gt;mon_synchronize&lt;/span&gt;&lt;span class="s1"&gt;'
  activerecord (4.1.7) lib/active_record/connection_adapters/abstract/connection_pool.rb:146:in `synchronize'&lt;/span&gt;
  &lt;span class="n"&gt;activerecord&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;4.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;active_record&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;connection_adapters&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;abstract&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;connection_pool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;134&lt;/span&gt;&lt;span class="ss"&gt;:in&lt;/span&gt; &lt;span class="sb"&gt;`poll'
  activerecord (4.1.7) lib/active_record/connection_adapters/abstract/connection_pool.rb:418:in `&lt;/span&gt;&lt;span class="n"&gt;acquire_connection&lt;/span&gt;&lt;span class="s1"&gt;'
  activerecord (4.1.7) lib/active_record/connection_adapters/abstract/connection_pool.rb:351:in `block in checkout'&lt;/span&gt;
  &lt;span class="sr"&gt;/usr/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rvm&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rubies&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ruby&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p643&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ruby&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;monitor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="ss"&gt;:in&lt;/span&gt; &lt;span class="sb"&gt;`mon_synchronize'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;nginx 配置&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;client_max_body_size&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;passenger_max_pool_size&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;listen&lt;/span&gt;       &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;server_name&lt;/span&gt;  &lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
             &lt;span class="n"&gt;root&lt;/span&gt;   &lt;span class="sr"&gt;/we/&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="kp"&gt;public&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
             &lt;span class="n"&gt;index&lt;/span&gt;  &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;htm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
             &lt;span class="n"&gt;passenger_enabled&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
         &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;database.yml&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="ss"&gt;development: &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;development&lt;/span&gt;
  &lt;span class="ss"&gt;adapter: &lt;/span&gt;&lt;span class="n"&gt;mysql2&lt;/span&gt;
  &lt;span class="ss"&gt;encoding: &lt;/span&gt;&lt;span class="n"&gt;utf8&lt;/span&gt;
  &lt;span class="ss"&gt;host: &lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;
  &lt;span class="ss"&gt;database: &lt;/span&gt;&lt;span class="n"&gt;mall&lt;/span&gt;
  &lt;span class="ss"&gt;pool: &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
  &lt;span class="ss"&gt;username: &lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;
  &lt;span class="ss"&gt;password: &lt;/span&gt;&lt;span class="mi"&gt;123456&lt;/span&gt;
  &lt;span class="ss"&gt;reconnect: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
  &lt;span class="ss"&gt;timeout: &lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;sidekiq.yml&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="ss"&gt;production:
  :concurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;尝试过的解决办法：
把 pool 加大，config.ru 添加&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;use&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;ConnectionAdapters&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;ConnectionManagement&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;都没有解决此问题，不定时的就会出现这个报错，找不到具体引发的原因 &lt;img title=":sob:" alt="😭" src="https://twemoji.ruby-china.com/2/svg/1f62d.svg" class="twemoji"&gt;   求教&lt;/p&gt;</description>
      <author>tianlitao</author>
      <pubDate>Thu, 22 Dec 2016 15:54:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/31972</link>
      <guid>https://ruby-china.org/topics/31972</guid>
    </item>
    <item>
      <title>求教，不知道这个语句有没有更简便的写法呢，看着太丑了。</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Plan&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="s1"&gt;'((start_time &amp;gt;= ? and start_time &amp;lt;= ?) or (end_time &amp;gt;= ? and end_time &amp;lt;= ?) or (start_time  &amp;gt;=  ? and end_time &amp;lt;= ?) or (start_time &amp;lt;= ? and end_time &amp;gt;= ?) )'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;start_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;给出一个时间段，判断是否和数据库已存在的时间区间有重叠的部分
补充：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#  a:       |------|&lt;/span&gt;
&lt;span class="c1"&gt;#  b:   |------|&lt;/span&gt;
&lt;span class="c1"&gt;#  a.start_time &amp;gt;= start_at and a.start_time &amp;lt;= end_at&lt;/span&gt;
&lt;span class="c1"&gt;#  a: |------| &lt;/span&gt;
&lt;span class="c1"&gt;#  b:    |------|&lt;/span&gt;
&lt;span class="c1"&gt;#  a.end_time &amp;gt;= start_at and a.end_time &amp;lt;= end_at&lt;/span&gt;
&lt;span class="c1"&gt;#  a:   |------|&lt;/span&gt;
&lt;span class="c1"&gt;#  b: |----------|&lt;/span&gt;
&lt;span class="c1"&gt;#  a.start_time &amp;gt;= start_at and a.end_time &amp;lt;= end_at&lt;/span&gt;
&lt;span class="c1"&gt;#  a: |----------|&lt;/span&gt;
&lt;span class="c1"&gt;#  b:   |------|&lt;/span&gt;
&lt;span class="c1"&gt;#  a.start_time &amp;lt;= start_at and a.end_time &amp;gt;= end_at&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用 &lt;a href="#reply1" class="at_floor" data-floor="1"&gt;#1 楼&lt;/a&gt; &lt;a href="/mimosa" class="user-mention" title="@mimosa"&gt;&lt;i&gt;@&lt;/i&gt;mimosa&lt;/a&gt; 简化参数后方法为&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Plan&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="s1"&gt;'((start_time &amp;gt;= :start_at and start_time &amp;lt;= :end_at) or (end_time &amp;gt;= :start_at and end_time &amp;lt;=  :end_at) or (start_time  &amp;gt;= :start_at and end_time &amp;lt;=  :end_at) or (start_time &amp;lt;= :start_at and end_time &amp;gt;=  :end_at) )'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="ss"&gt;start_at: &lt;/span&gt;&lt;span class="n"&gt;start_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;end_at: &lt;/span&gt;&lt;span class="n"&gt;end_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;优化后的结果：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#  a:       |------|&lt;/span&gt;
&lt;span class="c1"&gt;#  b:   |------|&lt;/span&gt;
&lt;span class="c1"&gt;#  a.start_time &amp;gt;= start_at and a.start_time &amp;lt;= end_at&lt;/span&gt;
&lt;span class="c1"&gt;#  a: |------| &lt;/span&gt;
&lt;span class="c1"&gt;#  b:    |------|&lt;/span&gt;
&lt;span class="c1"&gt;#  a.start_time &amp;lt;= start_at and a.end_time &amp;gt;= start_at&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Plan&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="s1"&gt;'((start_time &amp;gt;= :start_at and start_time &amp;lt;= :end_at) or (start_time &amp;lt;= :start_at and end_time &amp;gt;=  :start_at) )'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="ss"&gt;start_at: &lt;/span&gt;&lt;span class="n"&gt;start_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;end_at: &lt;/span&gt;&lt;span class="n"&gt;end_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="#reply12" class="at_floor" data-floor="12"&gt;#12 楼&lt;/a&gt; 最终的结果：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Plan&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="s1"&gt;'start_time &amp;lt;= ? and end_time &amp;gt;= ?'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start_at&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>tianlitao</author>
      <pubDate>Sat, 15 Oct 2016 13:26:36 +0800</pubDate>
      <link>https://ruby-china.org/topics/31330</link>
      <guid>https://ruby-china.org/topics/31330</guid>
    </item>
    <item>
      <title>分享一点 Rails 开发时遇到的代码问题</title>
      <description>&lt;h3 id="最近项目经常会内存被占满，后来看了过了一遍代码，整理了一下遇到的问题，其实大部分都是中文指南上有讲的，可能平时都不大注意写法。"&gt;最近项目经常会内存被占满，后来看了过了一遍代码，整理了一下遇到的问题，其实大部分都是中文指南上有讲的，可能平时都不大注意写法。&lt;/h3&gt;&lt;h3 id="假设有个product表，数量在百万级别的。"&gt;假设有个 product 表，数量在百万级别的。&lt;/h3&gt;&lt;h3 id="1.如果查询出来的数据特别多需要遍历，比如可能会有这种情况"&gt;1.如果查询出来的数据特别多需要遍历，比如可能会有这种情况&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Product&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="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nf"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种做法是致命的，切记不要这么做，因为一次读出所有的 product 数据不仅慢，如果特别多，会把内存撑满的。一定要用 find_each 或 find_in_batches 代替 each，中文指南的文档在&lt;a href="http://guides.ruby-china.org/active_record_querying.html#%E8%8E%B7%E5%8F%96%E5%A4%9A%E4%B8%AA%E5%AF%B9%E8%B1%A1" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2.见到有些同事喜欢用这种写法"&gt;2.见到有些同事喜欢用这种写法&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;SELECT&lt;/span&gt; &lt;span class="sb"&gt;`products`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;*&lt;/span&gt; &lt;span class="no"&gt;FROM&lt;/span&gt; &lt;span class="sb"&gt;`products`&lt;/span&gt;  &lt;span class="no"&gt;WHERE&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sell&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样写在数据量大得时候查询会非常慢，并且占用内存会非常多，如果可以替换，我觉得这样的写法更好&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pluck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;SELECT&lt;/span&gt; &lt;span class="sb"&gt;`products`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="sb"&gt;` FROM `&lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="sb"&gt;`  WHERE (products.sell = 1)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不仅查询的快，而且占用内存也会极大的降低。&lt;/p&gt;
&lt;h3 id="3.使用includes，防止n+1查询，文档"&gt;3.使用 includes，防止 n+1 查询，&lt;a href="http://guides.ruby-china.org/active_record_querying.html#%E6%8C%89%E9%9C%80%E5%8A%A0%E8%BD%BD%E5%85%B3%E8%81%94" rel="nofollow" target="_blank" title=""&gt;文档&lt;/a&gt;
&lt;/h3&gt;&lt;h3 id="4.防止预查询，有的时候我们会把一个查询语句赋给一个值，然后后边调用，比如说："&gt;&lt;del&gt;4.防止预查询，有的时候我们会把一个查询语句赋给一个值，然后后边调用，比如说：&lt;/del&gt;&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Product&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;product_names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pluck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;product_brands&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pluck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:brand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直接这样写的话在第一句的时候会直接把所有的 product 查询出来，不仅耗时，而且占用内存。防止预查询的做法是&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Product&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="kp"&gt;false&lt;/span&gt;
&lt;span class="n"&gt;product_names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pluck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;product_brands&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pluck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:brand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="5.查看日志的时候还找到了一个比较费时的sql"&gt;5.查看日志的时候还找到了一个比较费时的 sql&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Product&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;pluck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:brand_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;uniq&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后来我用 distinct 来代替了&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Product&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;pluck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'distinct brand_id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样虽说加长了 sql 得运行时间但是减少了返回的数据量以及内存占用。&lt;/p&gt;
&lt;h3 id="6.使用explain来优化sql，并建立相应的索引"&gt;6.使用 explain 来优化 sql，并建立相应的索引&lt;/h3&gt;
&lt;p&gt;如果有更好的写法，或者其它比较需要注意的地方，欢迎指导 &lt;img title=":smile:" alt="😄" src="https://twemoji.ruby-china.com/2/svg/1f604.svg" class="twemoji"&gt;&lt;/p&gt;</description>
      <author>tianlitao</author>
      <pubDate>Sun, 10 Jul 2016 18:12:00 +0800</pubDate>
      <link>https://ruby-china.org/topics/30491</link>
      <guid>https://ruby-china.org/topics/30491</guid>
    </item>
    <item>
      <title>是不是像石家庄这种的小城市都没有公司用 ruby 呢</title>
      <description>&lt;p&gt;&lt;img title=":sob:" alt="😭" src="https://twemoji.ruby-china.com/2/svg/1f62d.svg" class="twemoji"&gt;&lt;/p&gt;</description>
      <author>tianlitao</author>
      <pubDate>Fri, 26 Jun 2015 12:41:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/26190</link>
      <guid>https://ruby-china.org/topics/26190</guid>
    </item>
    <item>
      <title>关于 gem 'faye' 如何获取所有连接的 client_id</title>
      <description>&lt;p&gt;新手求教&lt;/p&gt;</description>
      <author>tianlitao</author>
      <pubDate>Sun, 15 Feb 2015 10:51:47 +0800</pubDate>
      <link>https://ruby-china.org/topics/24274</link>
      <guid>https://ruby-china.org/topics/24274</guid>
    </item>
    <item>
      <title>[已解决] 最近在用'faye-rails'做即时聊天，本地跑的没有问题，但是通过 nginx 部署到服务器上就不能用 　</title>
      <description>&lt;p&gt;根据 faye-rails  这个＂demo＂做的，nginx 是需要做如何配置呢&lt;/p&gt;</description>
      <author>tianlitao</author>
      <pubDate>Fri, 09 Jan 2015 09:50:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/23623</link>
      <guid>https://ruby-china.org/topics/23623</guid>
    </item>
    <item>
      <title>进入每个页面为什么会执行两次方法</title>
      <description>&lt;p&gt;比如我要进入 index 页面会执行两次&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;index&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;方法，不知道为什么，求大牛解惑&lt;/p&gt;</description>
      <author>tianlitao</author>
      <pubDate>Mon, 17 Nov 2014 13:27:47 +0800</pubDate>
      <link>https://ruby-china.org/topics/22716</link>
      <guid>https://ruby-china.org/topics/22716</guid>
    </item>
    <item>
      <title>问一下有没有上传之前就进行裁减好图片的'gem'啊，我现在用的 paperclip，每次都要先上传，才能进行图片的裁减，感觉特别不方便</title>
      <description>&lt;p&gt;有没有知道的，或者用什么方法可以实现在上传之前进行裁减的，裁减完成之后在进行上传服务器&lt;/p&gt;</description>
      <author>tianlitao</author>
      <pubDate>Mon, 27 Oct 2014 11:34:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/22281</link>
      <guid>https://ruby-china.org/topics/22281</guid>
    </item>
    <item>
      <title>paperclip 在 production 环境下裁减图片后显示不出来，只有重启 rails 服务才能正常显示</title>
      <description>&lt;p&gt;在 development 下一切正常，重启 rails 后可以正常显示。
本人菜鸟一枚，刚接触 rails，很多地方不懂，搜这个问题搜了一上午也没找到解决办法。不知道具体问题出在哪里。
图片不显示，但是 console 里也不报错&lt;/p&gt;</description>
      <author>tianlitao</author>
      <pubDate>Fri, 17 Oct 2014 15:19:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/22091</link>
      <guid>https://ruby-china.org/topics/22091</guid>
    </item>
  </channel>
</rss>
