<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>zhangjinzhu (Jinzhu)</title>
    <link>https://ruby-china.org/zhangjinzhu</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>GORM v2 正式发布！ 20k stars ;)</title>
      <description>&lt;p&gt;GORM 2.0 从零开始重写，根据过去几年的用户反馈吐槽，做了大量的改进，历经半年终于达成 ;)&lt;/p&gt;
&lt;h2 id="主要更新"&gt;主要更新&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;性能改进&lt;/li&gt;
&lt;li&gt;代码模块化&lt;/li&gt;
&lt;li&gt;Context，批量插入，预编译模式，DryRun 模式，Join 预加载，Find To Map，Create From Map，FindInBatches&lt;/li&gt;
&lt;li&gt;支持嵌套事务，SavePoint，Rollback To SavePoint&lt;/li&gt;
&lt;li&gt;SQL 生成器，命名参数，分组条件，Upsert，锁，支持 Optimizer/Index/Comment Hint，子查询改进，使用 SQL 表达式、Context Valuer 进行 CRUD&lt;/li&gt;
&lt;li&gt;支持完整的自引用，改进 Join Table，批量数据的关联模式&lt;/li&gt;
&lt;li&gt;允许多个字段用于追踪 create、update 时间，支持 UNIX（毫/纳）秒&lt;/li&gt;
&lt;li&gt;支持字段权限：只读、只写、只创建、只更新、忽略&lt;/li&gt;
&lt;li&gt;新的插件系统，为多个数据库提供了官方插件，读写分离，prometheus 集成...&lt;/li&gt;
&lt;li&gt;全新的 Hook API：带插件的统一接口&lt;/li&gt;
&lt;li&gt;全新的 Migrator：允许为关系创建数据库外键，更智能的 AutoMigrate，支持约束、检查器，增强索引支持&lt;/li&gt;
&lt;li&gt;全新的 Logger：支持 context、改进可扩展性&lt;/li&gt;
&lt;li&gt;统一命名策略：表名、字段名、连接表名、外键、检查器、索引名称规则&lt;/li&gt;
&lt;li&gt;更好的自定义类型支持（例如：JSON）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;详情请参考 Release Note&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gorm.io/zh_CN/docs/v2_release_note.html" rel="nofollow" target="_blank"&gt;https://gorm.io/zh_CN/docs/v2_release_note.html&lt;/a&gt;&lt;/p&gt;</description>
      <author>zhangjinzhu</author>
      <pubDate>Mon, 31 Aug 2020 06:24:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/40345</link>
      <guid>https://ruby-china.org/topics/40345</guid>
    </item>
    <item>
      <title>前方有坑，请注意。。。 蛋疼的 first_or_create</title>
      <description>&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;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
  &lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:class_name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"OrderItem"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderItem&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&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="n"&gt;after_create&lt;/span&gt; &lt;span class="ss"&gt;:print_order_items&lt;/span&gt;
  &lt;span class="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:order&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;print_order_items&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_sql&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Order&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="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&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;product_id: &lt;/span&gt;&lt;span class="mi"&gt;888&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;first_or_create&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;大家能猜中生成的 SQL 是什么么？&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="err"&gt;输出结果&lt;/span&gt;
&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="nv"&gt;`order_items`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="nv"&gt;`order_items`&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="nv"&gt;`order_items`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;`product_id`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;888&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="nv"&gt;`order_items`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;`order_id`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意上面的 product_id 的条件&lt;/p&gt;

&lt;p&gt;order.reload.items(true).to_sql  仍然无效哦。。。。。&lt;/p&gt;

&lt;p&gt;Order.find(order.id).items.to_sql  也并没有什么卵用。。。。。。&lt;/p&gt;</description>
      <author>zhangjinzhu</author>
      <pubDate>Sun, 16 Aug 2015 11:11:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/26943</link>
      <guid>https://ruby-china.org/topics/26943</guid>
    </item>
    <item>
      <title>也来谈谈怎么解决 12306 的问题</title>
      <description>&lt;p&gt;其实我感觉 12306 还是挺好的，当然因为火车动力不足的问题导致不能所有人都买到车票，这不是一个网站可以解决的&lt;/p&gt;

&lt;p&gt;12306 最大的矛盾就是他丫的买不到票，然后还不停的当机，你要不停的刷，各种工具来刷，这样子最直接的负面影响就是大家都在刷，都变慢了。。。。然后还是买不到票。。。。！！！&lt;/p&gt;

&lt;p&gt;我想了下，感觉换个技术方案应该可以搞定这个事情，大家来讨论下：&lt;/p&gt;

&lt;p&gt;把买票的流程调整为：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1）选择车票，提交订单，预约车票成功，以预约时间为队列排队。
2）12306 捏合订单
3）如果捏合成功：
    如果第一步已经付款，就直接出票，通知用户。
    如果第一步未付款，就通知用户付款，保留车票四小时。
    如果用户四小时内未付款，而取消该订单，把保留的车票释放
4）如果捏合失败，就继续等待
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其实对于火车票来说捏合订单应该是一个难点，怎么在最大的收益的情况下拉最多的人/或者说拉最多最需要火车票的人（因为近的人还有备选方案，例如汽车，发达地区如上海到北京之间可以选择飞机）&lt;/p&gt;

&lt;p&gt;如果 12306 可以根据当前的排队情况来自由的匹配订单，应该也可以很好的解决这些问题。&lt;/p&gt;

&lt;p&gt;对于刷票，黄牛票，如果在第一步使用队列的话，让他们刷呗，反正对于大家来说都是平等的，他刷了也不影响以前的人的排队顺序，也不能倒卖车票，因为他退票之后，会卖给队列中的第一个人，而不是最近来网站买票的人。
在没有利益驱动的情况下，应该就不会有黄牛票了。&lt;/p&gt;

&lt;p&gt;并且因为需要在第一步提交身份证信息，这时 12306 利用自己的优势，做个身份证校验应该不难吧，反正也不需要实时校对。&lt;/p&gt;

&lt;p&gt;当然也可以把上面的流程给优化一下，如果用户量不大的情况完成实时出票&lt;/p&gt;

&lt;p&gt;或者细节上做些优化，例如提供几个火车票的线路备选方案，优先买某个票之类的，约定一段时间内订单有效，超出时间买不到票自动退款，大家用起来应该也都挺爽的，12306 也挨少些骂。。。。&lt;/p&gt;

&lt;p&gt;然后因为第一步会预收款（应该大部分人会选择这样），对铁道部来说也能赚点利息，至少通知用户的短信钱肯定赚回来了，然后大家也不刷票了，就排队等呗，请求数也会少很多，硬件也可以节省开支，网站下再加点年货广告，各种广告啥的，赚点小钱，降低下自己的负债，多好。。。&lt;/p&gt;

&lt;p&gt;大家感觉可行性怎样？&lt;/p&gt;</description>
      <author>zhangjinzhu</author>
      <pubDate>Fri, 10 Jan 2014 14:27:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/16719</link>
      <guid>https://ruby-china.org/topics/16719</guid>
    </item>
    <item>
      <title>要小心使用 Where ("xxx NOT IN (?)"， array)  。。。</title>
      <description>&lt;p&gt;最近在项目上实际使用我用 go 写的 ORM 的时候发现一个问题&lt;/p&gt;

&lt;p&gt;db.Where("id NOT IN (?)", array) , 如果是数组为空，返回的结果竟然为 0, 我看了下生成的 SQL 是类似于这样：&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;USERS&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="err"&gt;这样子的&lt;/span&gt;&lt;span class="k"&gt;SQL&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;mysql&lt;/span&gt; &lt;span class="err"&gt;会返回空值&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我突然好奇，Rails 的 ActiveRecord 是怎么实现的。。。难道会 scan 一下 where 条件来判断，因为我印象中没有发现过这个问题。。。&lt;/p&gt;

&lt;p&gt;可是，试了一下竟然发现，如果条件为空数组是话，Rails 竟然也会返回一个空值。。。而不是我想象中全部返回&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;User&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="s2"&gt;"id NOT IN (?)"&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;搜索了一下，竟然发现 Ruby China 没有人提过这个事情。。。。。不知道是大家都知道呢，还是都没有注意过。。。&lt;/p&gt;

&lt;p&gt;然后看了下，推荐的做法就是：&lt;/p&gt;

&lt;p&gt;Rails 4: &lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;not&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;id: &lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之前的 Rails 版本就只能自己写 scope 处理了，例如&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;scope&lt;/span&gt; &lt;span class="ss"&gt;:excluding_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'id NOT IN (?)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;any?&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不过这样子只针对 ID。。。其它的字段，一个一个写 scope 吧。。。或者写个方法&lt;/p&gt;

&lt;p&gt;当然我也更新了下我的 go 的 ORM。。。加上了 Not 方法，类似这样子。。。&lt;/p&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Not&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;First&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Not&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;First&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>zhangjinzhu</author>
      <pubDate>Thu, 31 Oct 2013 18:46:00 +0800</pubDate>
      <link>https://ruby-china.org/topics/15191</link>
      <guid>https://ruby-china.org/topics/15191</guid>
    </item>
    <item>
      <title>用 Go 写了个类似 ActiveRecord 的 ORM 库， gorm</title>
      <description>&lt;p&gt;上个周未花了一个周未做成的，说明 GO 写起来程序还算是挺简单的&lt;/p&gt;

&lt;p&gt;功能类似 ActiveRecord, 目前我自己用起来感觉挺爽的，甚至某些地方比 ActiveRecord 还爽。。。。。。&lt;/p&gt;

&lt;p&gt;目前支持的功能&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CURD&lt;/li&gt;
&lt;li&gt;Chainable API&lt;/li&gt;
&lt;li&gt;Before/After Create/Save/Update/Delete Callbacks&lt;/li&gt;
&lt;li&gt;Order/Select/Limit/Offset Support&lt;/li&gt;
&lt;li&gt;Update, Updates Like Rails's update_attribute, update_attributes&lt;/li&gt;
&lt;li&gt;Dynamically set table name when search, update, delete...&lt;/li&gt;
&lt;li&gt;Automatically CreatedAt, UpdatedAt&lt;/li&gt;
&lt;li&gt;Soft Delete&lt;/li&gt;
&lt;li&gt;Create table from struct&lt;/li&gt;
&lt;li&gt;Prevent SQL Injection&lt;/li&gt;
&lt;li&gt;Goroutines friendly&lt;/li&gt;
&lt;li&gt;Database Pool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;不过现在只是社会主义的初期阶段，还有一些功能没有完成。。。轻拍。。。。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/jinzhu/gorm" rel="nofollow" target="_blank"&gt;https://github.com/jinzhu/gorm&lt;/a&gt;&lt;/p&gt;</description>
      <author>zhangjinzhu</author>
      <pubDate>Tue, 29 Oct 2013 13:51:22 +0800</pubDate>
      <link>https://ruby-china.org/topics/15120</link>
      <guid>https://ruby-china.org/topics/15120</guid>
    </item>
    <item>
      <title>六人小组去＊厦门＊休闲工作一个月，有推荐 / 赞助工作场所，或者想一起讨论问题玩的么？</title>
      <description>&lt;p&gt;感谢英明的老板，我们公司允许我们去外地工作一段时间体验各种生活．．．&lt;/p&gt;

&lt;p&gt;我们公司的一个六人小组决定去厦门及其周边呆上一个月，因为工作日还需要工作，所以想问问大家有没有推荐/赞助（随便几天都可以，其它时间我们可以 fallback 到图书馆，咖啡厅．．．）工作场所的．．．主要能解决一下网络的问题就好，．．．&lt;/p&gt;

&lt;p&gt;或者有想在一起交流交流的也好．．．&lt;/p&gt;

&lt;p&gt;我们这周未就要向厦门推进啦．．．求厦门同胞欢迎．．． ;)&lt;/p&gt;

&lt;p&gt;可以联系我的邮箱：wosmvp@gmail.com，感谢各种意见．．．&lt;/p&gt;</description>
      <author>zhangjinzhu</author>
      <pubDate>Fri, 10 May 2013 21:35:14 +0800</pubDate>
      <link>https://ruby-china.org/topics/10888</link>
      <guid>https://ruby-china.org/topics/10888</guid>
    </item>
    <item>
      <title>关于优化 MySQL 的一些经验</title>
      <description>&lt;p&gt;我写的一篇关于修改优化 mysql 的文章，好不容易写完，
欢迎大家移步我们公司的 blog 加加人气，挑挑错误。。。。。。  ;)&lt;/p&gt;

&lt;p&gt;From RDS to optimizing a MySQL Server on AWS&lt;/p&gt;

&lt;p&gt;&lt;a href="http://theplant.jp/en/blogs/19-from-rds-to-optimizing-a-mysql-server-on-aws" rel="nofollow" target="_blank"&gt;http://theplant.jp/en/blogs/19-from-rds-to-optimizing-a-mysql-server-on-aws&lt;/a&gt;&lt;/p&gt;</description>
      <author>zhangjinzhu</author>
      <pubDate>Thu, 21 Mar 2013 16:35:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/9654</link>
      <guid>https://ruby-china.org/topics/9654</guid>
    </item>
    <item>
      <title>关于缓存的一些思路。。。</title>
      <description>&lt;h2 id="缓存的问题:"&gt;缓存的问题：&lt;/h2&gt;
&lt;p&gt;1, 项目中写缓存往往比较简单，但是清缓存比较麻烦，往往是清缓存条件一大堆，要加各种 sweeper, observer 来清...
2, 在 views 中，通过 page/action/fragment 来缓存，可是这些缓存方法对 API json 类的请求有一定的局限性&lt;/p&gt;

&lt;p&gt;那么怎么缓存比较好呢？我的想法是:
1, 缓存不是用来清的，需要自动过期.
    例如：product A 的缓存的 key 需要和 product A 的更新时间相关，那么在这个产品 A 更新后，下次取缓存的时候，
    会去查找和更新时间绑定的缓存，也就是说 A 之前的缓存已经自动过期了，这次取会自动生成新的缓存。&lt;/p&gt;

&lt;p&gt;2, View 中的 cache 不是最重要的，最应该缓存的地方是取数据层，然后再把这些缓存数据 render。
    做为一个 Light Views/Controllers, Heavy Models 的程序来说，最应该缓存的是那些 model 的比较重量级方法。&lt;/p&gt;

&lt;p&gt;假设下面的例子：&lt;/p&gt;

&lt;p&gt;class Product
      def heavy_instance_method
        # .............
      end&lt;/p&gt;

&lt;p&gt;def self.heavy_class_method
      end
    end&lt;/p&gt;

&lt;p&gt;Product.find(1).heavy_instance_method
    Product.heavy_class_method&lt;/p&gt;

&lt;p&gt;假设上面的这两个方法都是比较耗时间，那么这两个方法可能就是一个被缓存的好例子.
  如果让你去缓存这个方法，怎么做呢？最简单的就是：&lt;/p&gt;

&lt;p&gt;class Product
      def heavy_instance_method
        Rails.cache.fetch("Product-heavy_instance_method-#{self.updated_at}") do
          ....
        end
      end
    end&lt;/p&gt;

&lt;p&gt;这里用了这个实例的 updated_at 做为 key 来帮助这个方法自动过期。。。虽然简单，可是挺恶心的....
  另外如果这是个类方法，或者里面的缓存如果再和其它类有相互依赖的话，就会麻烦的多....  &lt;/p&gt;

&lt;p&gt;为了解决上面的问题，我写了个 Gem, 先看一下怎么用：&lt;/p&gt;

&lt;p&gt;1, 将这个 gem 加到你的 Gemfile 中&lt;/p&gt;

&lt;p&gt;gem 'qor_cache'&lt;/p&gt;

&lt;p&gt;2, 定义你的配置文件&lt;/p&gt;

&lt;p&gt;# config/qor/cache.rb
    scope :product do
      cache_method :heavy_instance_method
      cache_class_method :heavy_class_method
    end&lt;/p&gt;

&lt;p&gt;3, 搞定了。。。。。。简单么？&lt;/p&gt;

&lt;p&gt;先从配置文件看一下，那么这个 gem 做了什么呢？简单的讲：&lt;/p&gt;

&lt;p&gt;scope :product 就是意味着 block 里面的操作是对 Product 这个 model 的操作
    cache_method :heavy_instance_method 就是说要缓存 Product 的实例方法 heavy_instance_method
    cache_class_method :heavy_class_method 就是说要缓存 Product 的类方法 heavy_class_method&lt;/p&gt;
&lt;h2 id="工作原理是什么呢？"&gt;工作原理是什么呢？&lt;/h2&gt;
&lt;p&gt;1, 对实例方法的缓存：&lt;/p&gt;

&lt;p&gt;alias 以前的 heavy_instance_method 方法
    重新生成一个 heavy_instance_method
    然后在这个新的 heavy_instance_method 中，调用 Rails.cache, 以类名，方法名，更新时间为 key 进行缓存&lt;/p&gt;

&lt;p&gt;2, 对类方法的缓存：&lt;/p&gt;

&lt;p&gt;alias 以前的 heavy_class_method 方法
    重新生成一个新的 heavy_class_method 类方法
    然后在这个新的类方法中，调用 Rails.cache, 以类名，方法名，这个类的 cache_key 为 key 进行缓存
    (PS: 这个类的 cache_key 是一个随机值，会在这个类发生任意保存，删除后更新为新随机值)&lt;/p&gt;

&lt;p&gt;上面只是这个 gem 的一部分小功能，更多欢迎查看 README, 源代码。。。参考 &lt;a href="https://github.com/qor/qor_cache" rel="nofollow" target="_blank"&gt;https://github.com/qor/qor_cache&lt;/a&gt;
代码刚刚完成，木有经过再加工、再优化，大家先凑合着看吧... XD&lt;/p&gt;

&lt;p&gt;本来想再多写点，把所有的功能全部描述一遍，可是实在写不下去了，不知道怎么表述，文字功底太差了，所以点到为止，欢迎探讨。。。真佩服那些一写就能写几万字的神人。。。XD&lt;/p&gt;</description>
      <author>zhangjinzhu</author>
      <pubDate>Tue, 27 Nov 2012 18:37:06 +0800</pubDate>
      <link>https://ruby-china.org/topics/7130</link>
      <guid>https://ruby-china.org/topics/7130</guid>
    </item>
    <item>
      <title>"DSl For DSL" slides</title>
      <description>&lt;p&gt;我的 slides,  &lt;a href="http://jinzhu.me/2012rubyconf" rel="nofollow" target="_blank"&gt;http://jinzhu.me/2012rubyconf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;演讲时看听众情绪不高，作为码农语言控制能力有限，准备也不够充分，自乱阵脚，好多方面表达也不清楚。。。大家多多包涵。。。&lt;/p&gt;

&lt;p&gt;大家有兴趣的话，可以再联系我，过段时间写个 blog 再描述下。。。&lt;/p&gt;

&lt;p&gt;（注：好多童鞋看我的 slides 木注意到右边的导航条，分上下和左右的。。。）&lt;/p&gt;</description>
      <author>zhangjinzhu</author>
      <pubDate>Mon, 19 Nov 2012 14:31:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/6899</link>
      <guid>https://ruby-china.org/topics/6899</guid>
    </item>
    <item>
      <title>写了个成人用品类导购网站，求评测。。。。。。</title>
      <description>&lt;p&gt;从开始到现在花了差不多三个月的业余时间，扣除中间出去玩，还有一些杂事，
差不多两个月的业余从头到屁股码了个成人用品的导购网站。。。 &amp;amp;.&amp;amp;&lt;/p&gt;

&lt;p&gt;功能主要包含两部分：&lt;/p&gt;

&lt;p&gt;1, 展现产品，优化分类，归纳产品，显示产品的优惠信息，包邮信息之类
2, 关于网站的推广及相关佣金的计算&lt;/p&gt;

&lt;p&gt;2.5 还有相关的一系列工具（例如浏览器插件）来帮助维护产品信息，不过这些前台不可见。。。&lt;/p&gt;

&lt;p&gt;产品主页： &lt;a href="http://www.murenwu.com/" rel="nofollow" target="_blank"&gt;http://www.murenwu.com/&lt;/a&gt;
推广主页： &lt;a href="http://www.murenwu.com/account/union/rule" rel="nofollow" target="_blank"&gt;http://www.murenwu.com/account/union/rule&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;刚刚做完没多久，想上线，看看还有什么不足，问题。。。求围观，求评测，求指点！&lt;/p&gt;</description>
      <author>zhangjinzhu</author>
      <pubDate>Mon, 10 Sep 2012 19:13:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/5463</link>
      <guid>https://ruby-china.org/topics/5463</guid>
    </item>
    <item>
      <title>大家有木有 deploy 错分支到 production 上去过，capistrano-confirm 让你 deploy 前确认先做个数学题</title>
      <description>&lt;p&gt;昨天我一个不小心 deploy 错分支到 production 上去了。。。。。。。。。
然后就写了个工具 capistrano-confirm 让你在 deploy 之前先确认一下 XD&lt;/p&gt;

&lt;p&gt;README， SourceCode &lt;a href="http://goo.gl/HvN6p" rel="nofollow" target="_blank"&gt;http://goo.gl/HvN6p&lt;/a&gt;  &lt;/p&gt;</description>
      <author>zhangjinzhu</author>
      <pubDate>Fri, 16 Dec 2011 14:14:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/506</link>
      <guid>https://ruby-china.org/topics/506</guid>
    </item>
  </channel>
</rss>
