<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>khiav223577 (Rumble Huang)</title>
    <link>https://ruby-china.org/khiav223577</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>active_model_cachers 轻巧方便的缓存工具</title>
      <description>&lt;h2 id="简介："&gt;简介：&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/khiav223577/active_model_cachers" rel="nofollow" target="_blank" title=""&gt;active_model_cachers&lt;/a&gt; 能够让你以简单的方式去设定缓存机制，能够自由设定缓存的目标、以及何时清理缓存。支援 Rails 3, 4, 5。&lt;/p&gt;
&lt;h2 id="安装"&gt;安装&lt;/h2&gt;
&lt;p&gt;在 Gemfile 里加上这行：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'active_model_cachers'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加一个 initializer 到你的专案：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;ActiveModelCachers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&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;config&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&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="c1"&gt;# 设定缓存的操作介面&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="使用范例"&gt;使用范例&lt;/h2&gt;
&lt;p&gt;名字与 lambda 内容都能自由更改&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;something_you_want_to_cache&lt;/code&gt; 是缓存的 key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-&amp;gt;{ get_the_data_on_cache_miss }&lt;/code&gt; 是缓存的资料，lambda 的回传值会存入缓存&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;expire_by: 'User'&lt;/code&gt; 设定监控目标，当目标变动时，主动过期缓存&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&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;cache_at&lt;/span&gt; &lt;span class="ss"&gt;:something_you_want_to_cache&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;get_the_data_on_cache_miss&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="ss"&gt;expire_by: &lt;/span&gt;&lt;span class="s1"&gt;'User'&lt;/span&gt;
&lt;span class="k"&gt;end&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;cacher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;something_you_want_to_cache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="特性"&gt;特性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;能缓存任意的 SQL query 结果、以及非资料库的资料，如耗时的函式运算结果、外部请求的回传内容&lt;/li&gt;
&lt;li&gt;透过 after_commit 清理过期的缓存，支援 create, update, destroy, 甚至 delete。&lt;/li&gt;
&lt;li&gt;智能地取用关联缓存以及已 eager-loading 的资料，减少资料库存取&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;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;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:posts&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;take&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;cacher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;posts&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 无缓存时，仍然不会额外存取资料库&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;支援主动清理缓存&lt;/li&gt;
&lt;li&gt;支援直接查询缓存内容&lt;/li&gt;
&lt;li&gt;支援缓存关联 (has_one, belongs_to, has_many)&lt;/li&gt;
&lt;li&gt;支援缓存属性 (attribute)&lt;/li&gt;
&lt;li&gt;支援以不同主键缓存自身&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&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;cache_self&lt;/span&gt; &lt;span class="ss"&gt;by: :account&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="vi"&gt;@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;cacher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_by&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;account: &lt;/span&gt;&lt;span class="s1"&gt;'khiav'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="比较"&gt;比较&lt;/h2&gt;
&lt;p&gt;与 &lt;a href="https://github.com/Shopify/identity_cache" rel="nofollow" target="_blank" title=""&gt;identity_cache&lt;/a&gt; 、 &lt;a href="https://github.com/hooopo/second_level_cache" rel="nofollow" target="_blank" title=""&gt;second_level_cache&lt;/a&gt; 不同的是，这二者著重在于缓存 &lt;code&gt;ActiveRecord&lt;/code&gt;，对 AR 进行扩展，方便度较高，但弹性也因而降低。而 &lt;a href="https://github.com/khiav223577/active_model_cachers" rel="nofollow" target="_blank" title=""&gt;active_model_cachers&lt;/a&gt; 著重于自由设定缓存，不局限于缓存 AR。详细功能差异可参考&lt;a href="https://github.com/khiav223577/active_model_cachers#compare-with-identity_cache" rel="nofollow" target="_blank" title=""&gt;这里&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="更完整的介绍"&gt;更完整的介绍&lt;/h2&gt;
&lt;p&gt;详细功能与使用说明，可以到 github repository 上观看：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/khiav223577/active_model_cachers" rel="nofollow" target="_blank"&gt;https://github.com/khiav223577/active_model_cachers&lt;/a&gt;&lt;/p&gt;</description>
      <author>khiav223577</author>
      <pubDate>Sun, 20 May 2018 12:53:24 +0800</pubDate>
      <link>https://ruby-china.org/topics/36806</link>
      <guid>https://ruby-china.org/topics/36806</guid>
    </item>
    <item>
      <title>[分享] 更方便在 Rails 内写 OR 语句的 gem</title>
      <description>&lt;p&gt;新人发帖，请多指教～～&lt;br&gt;
&lt;a href="https://github.com/khiav223577/rails_or" rel="nofollow" target="_blank" title=""&gt;rails_or&lt;/a&gt; 是我写的一个小工具，希望让大家在写 Rails 时能够更开心点。&lt;/p&gt;

&lt;p&gt;大家可能知道，Rails 5 终于在 Active Record 内加上了 or 函式，&lt;br&gt;
让你可以写以下的语句：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Person&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;name: &lt;/span&gt;&lt;span class="s1"&gt;'Pearl'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;or&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Person&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;age: &lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是每次 or 语句内都得重复写上&lt;code&gt;Model.where(XXX)&lt;/code&gt;，很繁琐。&lt;br&gt;
假如你又要 join 其它 table 的资料时，又更繁琐了：&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;joins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:posts&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;id: &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;or&lt;/span&gt;&lt;span class="p"&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;joins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:posts&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;'posts.title = ?'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;or&lt;/span&gt;&lt;span class="p"&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;joins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:posts&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;'posts.created_at &amp;gt; ?'&lt;/span&gt;&lt;span class="p"&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;day&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="https://github.com/khiav223577/rails_or" rel="nofollow" target="_blank" title=""&gt;rails_or&lt;/a&gt; 支援了更方便的语法，&lt;br&gt;
同时也支援了 Rails 3, 4, 5，不必担心版本升级的问题，&lt;br&gt;
也不必苦苦等待升到 Rails 5 的那天才能写 or 语句。&lt;/p&gt;

&lt;p&gt;语法如下所示：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Person&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;name: &lt;/span&gt;&lt;span class="s1"&gt;'Pearl'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;or&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;age: &lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&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;joins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:posts&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;id: &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;or&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'posts.title'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;or&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'posts.created_at &amp;gt; ?'&lt;/span&gt;&lt;span class="p"&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;day&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ago&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;代码都在 &lt;a href="https://github.com/khiav223577/rails_or" rel="nofollow" target="_blank"&gt;https://github.com/khiav223577/rails_or&lt;/a&gt; 上，&lt;br&gt;
欢迎大家使用或提交 pull request，&lt;br&gt;
喜欢的也可以顺便帮忙给颗星、推广一下呗。&lt;/p&gt;</description>
      <author>khiav223577</author>
      <pubDate>Mon, 16 Jan 2017 22:49:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/32148</link>
      <guid>https://ruby-china.org/topics/32148</guid>
    </item>
  </channel>
</rss>
