<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>torvaldsdb (K-night)</title>
    <link>https://ruby-china.org/torvaldsdb</link>
    <description>再过十年，互联网必定是九零后的天下。</description>
    <language>en-us</language>
    <item>
      <title>Ruby, Bunlder, ROR 升级遇见的坑/升级说明 (集中讨论)</title>
      <description>&lt;p&gt;随着最新版本 &lt;code&gt;Ruby 2.7.0&lt;/code&gt;, &lt;code&gt;Bundler 2.1.4&lt;/code&gt;, &lt;code&gt;Rails 6.0.2&lt;/code&gt;的到来&lt;img title=":clap:" alt="👏" src="https://twemoji.ruby-china.com/2/svg/1f44f.svg" class="twemoji"&gt;, 项目中升级遇到哪些坑，集中讨论，欢迎&lt;img title=":tada:" alt="🎉" src="https://twemoji.ruby-china.com/2/svg/1f389.svg" class="twemoji"&gt;&lt;img title=":tada:" alt="🎉" src="https://twemoji.ruby-china.com/2/svg/1f389.svg" class="twemoji"&gt;&lt;img title=":tada:" alt="🎉" src="https://twemoji.ruby-china.com/2/svg/1f389.svg" class="twemoji"&gt;&lt;img title=":tada:" alt="🎉" src="https://twemoji.ruby-china.com/2/svg/1f389.svg" class="twemoji"&gt;补充：&lt;/p&gt;</description>
      <author>torvaldsdb</author>
      <pubDate>Mon, 30 Mar 2020 18:20:51 +0800</pubDate>
      <link>https://ruby-china.org/topics/39682</link>
      <guid>https://ruby-china.org/topics/39682</guid>
    </item>
    <item>
      <title>Rails 验证 on: :context</title>
      <description>&lt;p&gt;&lt;a href="https://guides.rubyonrails.org/active_record_validations.html" rel="nofollow" target="_blank" title=""&gt;数据验证&lt;/a&gt;
给出一个实例 model -- &lt;strong&gt;User&lt;/strong&gt;&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;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;validate&lt;/span&gt; &lt;span class="ss"&gt;:first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;  &lt;span class="c1"&gt;# case 1&lt;/span&gt;
  &lt;span class="n"&gt;validate&lt;/span&gt; &lt;span class="ss"&gt;:last_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;on: :create&lt;/span&gt; &lt;span class="c1"&gt;# case 2&lt;/span&gt;
  &lt;span class="n"&gt;validate&lt;/span&gt; &lt;span class="ss"&gt;:nickname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;presence: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;on: :update&lt;/span&gt; &lt;span class="c1"&gt;# case 3&lt;/span&gt;
  &lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:balance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;numericality: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;on: :admin&lt;/span&gt; &lt;span class="c1"&gt;# case 4 一种定制的 context&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构造 User 数据：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;FactoryGirl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;factory&lt;/span&gt; &lt;span class="ss"&gt;:user&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;first_name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first_name&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;last_name&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first_name&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;nickname&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;factory&lt;/span&gt; &lt;span class="ss"&gt;:user_without_first_name&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;first_name&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;factory&lt;/span&gt; &lt;span class="ss"&gt;:user_without_last_name&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;last_name&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;factory&lt;/span&gt; &lt;span class="ss"&gt;:user_without_nickname&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;nickname&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;factory&lt;/span&gt; &lt;span class="ss"&gt;:user_without_balance&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="n"&gt;factory&lt;/span&gt; &lt;span class="ss"&gt;:user_with_negative_balance&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
      &lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="no"&gt;Faker&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;negative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&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;详细解释一下示例中的四种校验
假设：&lt;code&gt;user&lt;/code&gt; 是 User 的一个实例。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;em&gt;first_name&lt;/em&gt; 的验证，没有定义 context(没有&lt;code&gt;on: **&lt;/code&gt;的存在), 这种验证在 &lt;code&gt;user&lt;/code&gt; 每次 save 的时候都会被触发。&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;last_name&lt;/em&gt; 的验证，定义了 context(on: :create), 该验证只有 &lt;code&gt;user&lt;/code&gt; 是新建数据，满足&lt;a href="https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-new_record-3F" rel="nofollow" target="_blank" title=""&gt;#new_record?&lt;/a&gt;为 &lt;code&gt;true&lt;/code&gt;, save 的时候触发。&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;nickname&lt;/em&gt; 的验证，同样定义了 context(on: :update), 该验证&lt;strong&gt;理论上应该在更新数据 (数据 user&lt;a href="https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-persisted-3F" rel="nofollow" target="_blank" title=""&gt;#persisted?&lt;/a&gt;为 &lt;code&gt;true&lt;/code&gt;) 的时候才会触发，测试中 &lt;code&gt;on: :update&lt;/code&gt; == &lt;code&gt;on: [:create, :update]&lt;/code&gt;&lt;/strong&gt;, 无论是新建数据还是更新数据都会触发。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 验证on: :create&lt;/span&gt;
&lt;span class="c1"&gt;# 新建一个没有 last_name 的 user&lt;/span&gt;
&lt;span class="n"&gt;user_without_last_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;FactoryGirl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user_without_last_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;user_without_last_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;valid?&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; false&lt;/span&gt;
&lt;span class="c1"&gt;# 更新一个没有 last_name 的 user&lt;/span&gt;
&lt;span class="n"&gt;user_without_last_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;validate: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;user_without_last_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;valid?&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; true&lt;/span&gt;

&lt;span class="c1"&gt;# 验证on: :update&lt;/span&gt;
&lt;span class="c1"&gt;# 新建一个没有 nickname 的 user&lt;/span&gt;
&lt;span class="n"&gt;user_without_nickname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;FactoryGirl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user_without_nickname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;user_without_nickname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;valid?&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; false&lt;/span&gt;
&lt;span class="c1"&gt;# 更新一个没有 nickname 的 user&lt;/span&gt;
&lt;span class="n"&gt;user_without_nickname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;validate: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;user_without_nickname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;valid?&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;balance&lt;/em&gt; 的验证，自定义了 context(on: :admin), 这种方式需要特殊的触发方式:
&lt;a href="https://github.com/rails/rails/blob/98b56eda5d7ebc595b6768d53ee12ad6296b4066/activerecord/lib/active_record/validations.rb#L68" rel="nofollow" target="_blank" title=""&gt;context 源码&lt;/a&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Runs all the validations within the specified context. Returns +true+ if&lt;/span&gt;
&lt;span class="c1"&gt;# no errors are found, +false+ otherwise.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# If the argument is +false+ (default is +nil+), the context is set to &amp;lt;tt&amp;gt;:create&amp;lt;/tt&amp;gt; if&lt;/span&gt;
&lt;span class="c1"&gt;# &amp;lt;tt&amp;gt;new_record?&amp;lt;/tt&amp;gt; is +true+, and to &amp;lt;tt&amp;gt;:update&amp;lt;/tt&amp;gt; if it is not.&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# Validations with no &amp;lt;tt&amp;gt;:on&amp;lt;/tt&amp;gt; option will run no matter the context. Validations with&lt;/span&gt;
&lt;span class="c1"&gt;# some &amp;lt;tt&amp;gt;:on&amp;lt;/tt&amp;gt; option will only run in the specified context.&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;valid?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_record?&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="ss"&gt;:create&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ss"&gt;:update&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;empty?&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;output&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;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;FactoryGirl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# valid?&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;valid?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:admin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# save&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;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;context: :admin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;注意点&lt;/strong&gt;: &lt;/p&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;FactoryGirl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;当你运行&lt;code&gt;user.valid?(:admin)&lt;/code&gt;的时候，只会验证&lt;strong&gt;first_name&lt;/strong&gt;, 与&lt;strong&gt;balance&lt;/strong&gt;, 并不会验证&lt;strong&gt;last_name&lt;/strong&gt; &lt;strong&gt;nickname&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;on: :admin 做为允许的条件，可以在保存的时候 #save(context: :admin), 如果默认保存的手做其他的限制，可以：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:balance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;numericality: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;on: :admin&lt;/span&gt;

&lt;span class="n"&gt;validates&lt;/span&gt; &lt;span class="ss"&gt;:balance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;numericality: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;greater_than_or_equal_to: &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; 
                    &lt;span class="ss"&gt;on: &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:create&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:update&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样 user.save 就会限制 balance 大于 0&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;context 在 &lt;strong&gt;autosave&lt;/strong&gt; 中的使用：
添加 Article&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;Article&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;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;autosave: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;构造 Article 数据：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;FactoryGirl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="n"&gt;factory&lt;/span&gt; &lt;span class="ss"&gt;:article&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="n"&gt;user&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;/p&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;FactoryGirl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;FactoryGirl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:article&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;user: &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;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assign_attributes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;balance: &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="c1"&gt;# valid?&lt;/span&gt;
&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;valid?&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; true&lt;/span&gt;
&lt;span class="c1"&gt;# valid?(:admin)&lt;/span&gt;
&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;valid?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:admin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; false&lt;/span&gt;

&lt;span class="c1"&gt;# save&lt;/span&gt;
&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; true&lt;/span&gt;
&lt;span class="c1"&gt;# save(:admin)&lt;/span&gt;
&lt;span class="n"&gt;article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:admin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;context&lt;/strong&gt; 在测试中写法&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'rails_helper'&lt;/span&gt;

&lt;span class="no"&gt;RSpec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;type: :model&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user_without_balance&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt; &lt;span class="n"&gt;be_valid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:admin&lt;/span&gt;&lt;span class="p"&gt;)&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;/li&gt;
&lt;/ol&gt;</description>
      <author>torvaldsdb</author>
      <pubDate>Sun, 29 Jul 2018 22:50:26 +0800</pubDate>
      <link>https://ruby-china.org/topics/37249</link>
      <guid>https://ruby-china.org/topics/37249</guid>
    </item>
    <item>
      <title>关于 inject, 疑惑的地方.</title>
      <description>&lt;p&gt;在控制台遇到的问题，看着相似，结果却截然不同。
意图：累加，如果小于 2, 就 &lt;code&gt;+1&lt;/code&gt;, 如果大于 3, 就 &lt;code&gt;+2&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&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;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="k"&gt;next&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="k"&gt;next&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
  &lt;span class="n"&gt;sum&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出结果：&lt;code&gt;=&amp;gt; 5&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&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;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="k"&gt;next&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
  &lt;span class="n"&gt;sum&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出结果：&lt;code&gt;=&amp;gt;1&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&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;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="k"&gt;next&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
  &lt;span class="k"&gt;next&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="n"&gt;sum&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出结果：&lt;code&gt;=&amp;gt;5&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&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;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="k"&gt;next&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
  &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="n"&gt;sum&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出结果：&lt;code&gt;=&amp;gt;4&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;究竟问题出在哪里？&lt;/p&gt;</description>
      <author>torvaldsdb</author>
      <pubDate>Sat, 03 Feb 2018 10:59:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/34988</link>
      <guid>https://ruby-china.org/topics/34988</guid>
    </item>
    <item>
      <title>环绕别名</title>
      <description>&lt;ul&gt;
&lt;li&gt;参看元编程的时候，发现环绕别名，感觉很新颖
&lt;img src="https://l.ruby-china.com/photo/2018/4c02cb19-2a17-41ff-98a5-63674ffa458e.png!large" title="" alt=""&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;自己在项目中测试了一下，却没有顺利执行，如下&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;User&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="k"&gt;alias&lt;/span&gt; &lt;span class="ss"&gt;:real_avatar&lt;/span&gt; &lt;span class="ss"&gt;:avatar&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;avatar&lt;/span&gt;
    &lt;span class="n"&gt;real_avatar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;present?&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;"real_avatar"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"default.png"&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;strong&gt;User&lt;/strong&gt; 实例：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;2.4.2 &lt;span class="o"&gt;(&lt;/span&gt;main&lt;span class="o"&gt;)&lt;/span&gt;:0 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; user &lt;span class="o"&gt;=&lt;/span&gt; User.last
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.3ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT  &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="s2"&gt;"users"&lt;/span&gt; ORDER BY &lt;span class="s2"&gt;"users"&lt;/span&gt;.&lt;span class="s2"&gt;"id"&lt;/span&gt; DESC LIMIT &lt;span class="nv"&gt;$1&lt;/span&gt;  &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&lt;/span&gt;, 1]]
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;#&amp;lt;User:0x00007fde39a372c0&lt;/span&gt;
 &lt;span class="nb"&gt;id&lt;/span&gt;: 2,
 uid: &lt;span class="s2"&gt;"017526292153702"&lt;/span&gt;,
 avatar: &lt;span class="s2"&gt;"http://img2.imgtn.bdimg.com/it/u=3563567972,3348399262&amp;amp;fm=27&amp;amp;gp=0.jpg"&lt;/span&gt;,
 nickname: &lt;span class="s2"&gt;"Nick-member"&lt;/span&gt;,
 created_at: Fri, 19 Jan 2018 00:26:16 CST +08:00,
 updated_at: Fri, 19 Jan 2018 00:26:16 CST +08:00&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;调用的 &lt;code&gt;atatar&lt;/code&gt;, 并没有展示我想要的 &lt;code&gt;"real_avatar"&lt;/code&gt;, 而是报了错误&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user.avatar

=&amp;gt; NameError: undefined method `avatar' for class `#&amp;lt;Class:0x00007fe4db80b6d8&amp;gt;'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;哪里出了错了吗？&lt;/p&gt;</description>
      <author>torvaldsdb</author>
      <pubDate>Fri, 19 Jan 2018 11:26:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/34915</link>
      <guid>https://ruby-china.org/topics/34915</guid>
    </item>
    <item>
      <title>ransackable_scopes 小结</title>
      <description>&lt;p&gt;&lt;code&gt;ransack&lt;/code&gt;今天遇到传递两个参数的 scope，然后查询使用&lt;code&gt;ransackable_scopes&lt;/code&gt;的时候，文档&lt;a href="https://github.com/activerecord-hackery/ransack#Authorization" rel="nofollow" target="_blank" title=""&gt;ransack&lt;/a&gt;中没有太多说明。
自己就捣弄了一会儿。抛砖引玉！&lt;/p&gt;

&lt;p&gt;store 的一个实例&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;pry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Store&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Store&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;integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;block_id: &lt;/span&gt;&lt;span class="n"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;district: &lt;/span&gt;&lt;span class="n"&gt;jsonb&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;pry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;
  &lt;span class="no"&gt;Store&lt;/span&gt; &lt;span class="no"&gt;Load&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.9&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="no"&gt;SELECT&lt;/span&gt;  &lt;span class="s2"&gt;"stores"&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="s2"&gt;"stores"&lt;/span&gt; &lt;span class="no"&gt;ORDER&lt;/span&gt; &lt;span class="no"&gt;BY&lt;/span&gt; &lt;span class="s2"&gt;"stores"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"created_at"&lt;/span&gt; &lt;span class="no"&gt;DESC&lt;/span&gt; &lt;span class="no"&gt;LIMIT&lt;/span&gt; &lt;span class="vg"&gt;$1&lt;/span&gt;  &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"LIMIT"&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="c1"&gt;#&amp;lt;Store:0x00000007aa6430&lt;/span&gt;
 &lt;span class="ss"&gt;id: &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;district: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"710000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"台湾省"&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原来的&lt;code&gt;scope&lt;/code&gt;如下：&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;:store_district&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;district_level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;district_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"district-&amp;gt;'&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;district_level&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;'-&amp;gt;&amp;gt;'id' = ?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;district_id&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;查询：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;pry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;
   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="no"&gt;SELECT&lt;/span&gt; &lt;span class="no"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="no"&gt;FROM&lt;/span&gt; &lt;span class="s2"&gt;"stores"&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;pry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store_district&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"710000"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="no"&gt;Store&lt;/span&gt; &lt;span class="no"&gt;Load&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3.1&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="no"&gt;SELECT&lt;/span&gt; &lt;span class="s2"&gt;"stores"&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="s2"&gt;"stores"&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;district&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'1'&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'710000'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="no"&gt;ORDER&lt;/span&gt; &lt;span class="no"&gt;BY&lt;/span&gt; &lt;span class="s2"&gt;"stores"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;"created_at"&lt;/span&gt; &lt;span class="no"&gt;DESC&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="c1"&gt;#&amp;lt;Store:0x000000071b9ed0&lt;/span&gt;
  &lt;span class="ss"&gt;id: &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;district: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"710000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"name"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"台湾省"&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 model 中声明：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;
  &lt;span class="c1"&gt;# ransackable scope&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ransackable_scopes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth_obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="sx"&gt;%i(store_district)&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;只是接口没有想到好的参数传递方式。后来就改写了 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;:store_district&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="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;params_hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_h&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deep_symbolize_keys&lt;/span&gt;
  &lt;span class="n"&gt;district_level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;district_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;params_hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:level&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;params_hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"district-&amp;gt;'&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;district_level&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;'-&amp;gt;&amp;gt;'id' = ?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;district_id&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;api 接口：
&lt;code&gt;localhost:3000/district/stores?store_district[level]=1&amp;amp;store_district[id]=710000&lt;/code&gt;
方法展示&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# GET district/stores?page[number]=1&amp;amp;store_district[level]=1&amp;amp;store_district[id]=710000&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_store_by_district&lt;/span&gt;
  &lt;span class="n"&gt;stores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&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="nf"&gt;result&lt;/span&gt;
  &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="o"&gt;***&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>torvaldsdb</author>
      <pubDate>Tue, 09 May 2017 01:28:51 +0800</pubDate>
      <link>https://ruby-china.org/topics/32952</link>
      <guid>https://ruby-china.org/topics/32952</guid>
    </item>
    <item>
      <title>邮箱里的一道题目, 有没有好的算法.</title>
      <description>&lt;p&gt;&lt;strong&gt;&lt;em&gt;关于排列组合的题目。昨晚用自己的方式已经解决。大家有没有好的算法探讨一下。&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;You&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;planning&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;big&lt;/span&gt; &lt;span class="n"&gt;programming&lt;/span&gt; &lt;span class="n"&gt;conference&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;received&lt;/span&gt; &lt;span class="n"&gt;many&lt;/span&gt; &lt;span class="n"&gt;proposals&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;passed&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;initial&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt; &lt;span class="n"&gt;having&lt;/span&gt; &lt;span class="n"&gt;trouble&lt;/span&gt; &lt;span class="n"&gt;fitting&lt;/span&gt; &lt;span class="n"&gt;them&lt;/span&gt; &lt;span class="n"&gt;into&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="n"&gt;constraints&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;day&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;there&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;so&lt;/span&gt; &lt;span class="n"&gt;many&lt;/span&gt; &lt;span class="n"&gt;possibilities!&lt;/span&gt; &lt;span class="no"&gt;So&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;write&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;program&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

    &lt;span class="no"&gt;The&lt;/span&gt; &lt;span class="n"&gt;conference&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;multiple&lt;/span&gt; &lt;span class="n"&gt;tracks&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;morning&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;afternoon&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="no"&gt;Each&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="n"&gt;contains&lt;/span&gt; &lt;span class="n"&gt;multiple&lt;/span&gt; &lt;span class="n"&gt;talks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="no"&gt;Morning&lt;/span&gt; &lt;span class="n"&gt;sessions&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;am&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;must&lt;/span&gt; &lt;span class="n"&gt;finish&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="n"&gt;noon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;lunch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="no"&gt;Afternoon&lt;/span&gt; &lt;span class="n"&gt;sessions&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;pm&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;must&lt;/span&gt; &lt;span class="n"&gt;finish&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;networking&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="no"&gt;The&lt;/span&gt; &lt;span class="n"&gt;networking&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;earlier&lt;/span&gt; &lt;span class="n"&gt;than&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;later&lt;/span&gt; &lt;span class="n"&gt;than&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="no"&gt;No&lt;/span&gt; &lt;span class="n"&gt;talk&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="no"&gt;All&lt;/span&gt; &lt;span class="n"&gt;talk&lt;/span&gt; &lt;span class="n"&gt;lengths&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;either&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;minutes&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;lightning&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="n"&gt;minutes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="no"&gt;Presenters&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;very&lt;/span&gt; &lt;span class="n"&gt;punctual&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;there&lt;/span&gt; &lt;span class="n"&gt;needs&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;gap&lt;/span&gt; &lt;span class="n"&gt;between&lt;/span&gt; &lt;span class="n"&gt;sessions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="no"&gt;Note&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;depending&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;how&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;choose&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;complete&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;problem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;solution&lt;/span&gt; &lt;span class="n"&gt;may&lt;/span&gt; &lt;span class="n"&gt;give&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;different&lt;/span&gt; &lt;span class="n"&gt;ordering&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;combination&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;talks&lt;/span&gt; &lt;span class="n"&gt;into&lt;/span&gt; &lt;span class="n"&gt;tracks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="no"&gt;This&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;acceptable&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;don&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;exactly&lt;/span&gt; &lt;span class="n"&gt;duplicate&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;sample&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="n"&gt;given&lt;/span&gt; &lt;span class="n"&gt;here&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="no"&gt;Test&lt;/span&gt; &lt;span class="ss"&gt;input:
&lt;/span&gt;&lt;span class="no"&gt;Writing&lt;/span&gt; &lt;span class="no"&gt;Fast&lt;/span&gt; &lt;span class="no"&gt;Tests&lt;/span&gt; &lt;span class="no"&gt;Against&lt;/span&gt; &lt;span class="no"&gt;Enterprise&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;Overdoing&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="no"&gt;Python&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;Lua&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="no"&gt;Masses&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;Ruby&lt;/span&gt; &lt;span class="no"&gt;Errors&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="no"&gt;Mismatched&lt;/span&gt; &lt;span class="no"&gt;Gem&lt;/span&gt; &lt;span class="no"&gt;Versions&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;Common&lt;/span&gt; &lt;span class="no"&gt;Ruby&lt;/span&gt; &lt;span class="no"&gt;Errors&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;Rails&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="no"&gt;Python&lt;/span&gt; &lt;span class="no"&gt;Developers&lt;/span&gt; &lt;span class="n"&gt;lightning&lt;/span&gt;
&lt;span class="no"&gt;Communicating&lt;/span&gt; &lt;span class="no"&gt;Over&lt;/span&gt; &lt;span class="no"&gt;Distance&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;Accounting&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="no"&gt;Driven&lt;/span&gt; &lt;span class="no"&gt;Development&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;Woah&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;Sit&lt;/span&gt; &lt;span class="no"&gt;Down&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="no"&gt;Write&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;Pair&lt;/span&gt; &lt;span class="no"&gt;Programming&lt;/span&gt; &lt;span class="n"&gt;vs&lt;/span&gt; &lt;span class="no"&gt;Noise&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;Rails&lt;/span&gt; &lt;span class="no"&gt;Magic&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;Ruby&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;Why&lt;/span&gt; &lt;span class="no"&gt;We&lt;/span&gt; &lt;span class="no"&gt;Should&lt;/span&gt; &lt;span class="no"&gt;Move&lt;/span&gt; &lt;span class="no"&gt;On&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;Clojure&lt;/span&gt; &lt;span class="no"&gt;Ate&lt;/span&gt; &lt;span class="no"&gt;Scala&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;my&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;Programming&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="no"&gt;Boondocks&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="no"&gt;Seattle&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;Ruby&lt;/span&gt; &lt;span class="n"&gt;vs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="no"&gt;Clojure&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="no"&gt;Back&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="no"&gt;End&lt;/span&gt; &lt;span class="no"&gt;Development&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;Ruby&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt; &lt;span class="no"&gt;Legacy&lt;/span&gt; &lt;span class="no"&gt;App&lt;/span&gt; &lt;span class="no"&gt;Maintenance&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;A&lt;/span&gt; &lt;span class="no"&gt;World&lt;/span&gt; &lt;span class="no"&gt;Without&lt;/span&gt; &lt;span class="no"&gt;HackerNews&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="no"&gt;User&lt;/span&gt; &lt;span class="no"&gt;Interface&lt;/span&gt; &lt;span class="no"&gt;CSS&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt; &lt;span class="no"&gt;Apps&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;

&lt;span class="no"&gt;Test&lt;/span&gt; &lt;span class="ss"&gt;output:
&lt;/span&gt;&lt;span class="no"&gt;Track&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="no"&gt;AM&lt;/span&gt; &lt;span class="no"&gt;Writing&lt;/span&gt; &lt;span class="no"&gt;Fast&lt;/span&gt; &lt;span class="no"&gt;Tests&lt;/span&gt; &lt;span class="no"&gt;Against&lt;/span&gt; &lt;span class="no"&gt;Enterprise&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="no"&gt;AM&lt;/span&gt; &lt;span class="no"&gt;Overdoing&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="no"&gt;Python&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="no"&gt;AM&lt;/span&gt; &lt;span class="no"&gt;Lua&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="no"&gt;Masses&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="no"&gt;AM&lt;/span&gt; &lt;span class="no"&gt;Ruby&lt;/span&gt; &lt;span class="no"&gt;Errors&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="no"&gt;Mismatched&lt;/span&gt; &lt;span class="no"&gt;Gem&lt;/span&gt; &lt;span class="no"&gt;Versions&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="no"&gt;PM&lt;/span&gt; &lt;span class="no"&gt;Lunch&lt;/span&gt;
&lt;span class="mo"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="no"&gt;PM&lt;/span&gt; &lt;span class="no"&gt;Ruby&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;Why&lt;/span&gt; &lt;span class="no"&gt;We&lt;/span&gt; &lt;span class="no"&gt;Should&lt;/span&gt; &lt;span class="no"&gt;Move&lt;/span&gt; &lt;span class="no"&gt;On&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mo"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="no"&gt;PM&lt;/span&gt; &lt;span class="no"&gt;Common&lt;/span&gt; &lt;span class="no"&gt;Ruby&lt;/span&gt; &lt;span class="no"&gt;Errors&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mo"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="no"&gt;PM&lt;/span&gt; &lt;span class="no"&gt;Pair&lt;/span&gt; &lt;span class="no"&gt;Programming&lt;/span&gt; &lt;span class="n"&gt;vs&lt;/span&gt; &lt;span class="no"&gt;Noise&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mo"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="no"&gt;PM&lt;/span&gt; &lt;span class="no"&gt;Programming&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="no"&gt;Boondocks&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="no"&gt;Seattle&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mo"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="no"&gt;PM&lt;/span&gt; &lt;span class="no"&gt;Ruby&lt;/span&gt; &lt;span class="n"&gt;vs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="no"&gt;Clojure&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="no"&gt;Back&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="no"&gt;End&lt;/span&gt; &lt;span class="no"&gt;Development&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mo"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="no"&gt;PM&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt; &lt;span class="no"&gt;Interface&lt;/span&gt; &lt;span class="no"&gt;CSS&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt; &lt;span class="no"&gt;Apps&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mo"&gt;05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="no"&gt;PM&lt;/span&gt; &lt;span class="no"&gt;Networking&lt;/span&gt; &lt;span class="no"&gt;Event&lt;/span&gt;

&lt;span class="no"&gt;Track&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="no"&gt;AM&lt;/span&gt; &lt;span class="no"&gt;Communicating&lt;/span&gt; &lt;span class="no"&gt;Over&lt;/span&gt; &lt;span class="no"&gt;Distance&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="no"&gt;AM&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt; &lt;span class="no"&gt;Magic&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="no"&gt;AM&lt;/span&gt; &lt;span class="no"&gt;Woah&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="no"&gt;AM&lt;/span&gt; &lt;span class="no"&gt;Sit&lt;/span&gt; &lt;span class="no"&gt;Down&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="no"&gt;Write&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="no"&gt;PM&lt;/span&gt; &lt;span class="no"&gt;Lunch&lt;/span&gt;
&lt;span class="mo"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="no"&gt;PM&lt;/span&gt; &lt;span class="no"&gt;Accounting&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="no"&gt;Driven&lt;/span&gt; &lt;span class="no"&gt;Development&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mo"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="no"&gt;PM&lt;/span&gt; &lt;span class="no"&gt;Clojure&lt;/span&gt; &lt;span class="no"&gt;Ate&lt;/span&gt; &lt;span class="no"&gt;Scala&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;my&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mo"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="no"&gt;PM&lt;/span&gt; &lt;span class="no"&gt;A&lt;/span&gt; &lt;span class="no"&gt;World&lt;/span&gt; &lt;span class="no"&gt;Without&lt;/span&gt; &lt;span class="no"&gt;HackerNews&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mo"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="no"&gt;PM&lt;/span&gt; &lt;span class="no"&gt;Ruby&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt; &lt;span class="no"&gt;Legacy&lt;/span&gt; &lt;span class="no"&gt;App&lt;/span&gt; &lt;span class="no"&gt;Maintenance&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;
&lt;span class="mo"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="no"&gt;PM&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="no"&gt;Python&lt;/span&gt; &lt;span class="no"&gt;Developers&lt;/span&gt; &lt;span class="n"&gt;lightning&lt;/span&gt;
&lt;span class="mo"&gt;05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mo"&gt;00&lt;/span&gt;&lt;span class="no"&gt;PM&lt;/span&gt; &lt;span class="no"&gt;Networking&lt;/span&gt; &lt;span class="no"&gt;Event&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我的大致思路是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;上午  下午分别进行排列组合&lt;/li&gt;
&lt;li&gt;上午下午的组合拼接在一起&lt;/li&gt;
&lt;li&gt;把有数据重复的组合剔除掉
这个过程耗时很久。&lt;strong&gt;&lt;em&gt;抛砖引玉&lt;/em&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>torvaldsdb</author>
      <pubDate>Fri, 17 Mar 2017 09:40:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/32558</link>
      <guid>https://ruby-china.org/topics/32558</guid>
    </item>
    <item>
      <title>Sublime Text 3 关于空格占位的图示</title>
      <description>&lt;p&gt;&lt;em&gt;sublime text3 关于空格占位的图示：&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/9d0ee63c89a7f428a178d74cdca5bd54.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;preferences -&amp;gt; settings 设置：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"auto_find_in_selection"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"bold_folder_labels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"color_scheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Packages/Color Scheme - Default/Monokai.tmTheme"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"dictionary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Packages/Language - English/en_US.dic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"ensure_newline_at_eof_on_save"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"font_face"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"Consolas"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"font_size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"highlight_line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"highlight_modified_tabs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"ignored_packages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s2"&gt;"Markdown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;"Vintage"&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="s2"&gt;"margin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"match_brackets_angle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"rulers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;80&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="s2"&gt;"show_encoding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"show_full_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"show_line_endings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"tab_size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"translate_tabs_to_spaces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"trim_trailing_white_space_on_save"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"use_simple_full_screen"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"word_wrap"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;想要的效果如图：&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/a8a0a6979a10607ba46db69fd3e6b2fc.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;是不是配置少了什么~&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;</description>
      <author>torvaldsdb</author>
      <pubDate>Mon, 19 Dec 2016 19:47:09 +0800</pubDate>
      <link>https://ruby-china.org/topics/31937</link>
      <guid>https://ruby-china.org/topics/31937</guid>
    </item>
    <item>
      <title>Window 10 下的开发 Rails</title>
      <description>&lt;h2 id="Guide"&gt;Guide&lt;/h2&gt;&lt;h2 id="window下开发需要条件"&gt;window 下开发需要条件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;首先下载虚拟机 vagrant： &lt;a href="http://www.softpedia.com/get/Programming/Other-Programming-Files/Vagrant.shtml#download" rel="nofollow" target="_blank" title=""&gt;Vagrant 下载&lt;/a&gt;，Vagrant 是一个基于 Ruby 的工具，用于创建和部署虚拟化开发环境。它使用 Oracle 的开源 VirtualBox 虚拟化系统，使用 Chef 创建自动化虚拟环境。那么我们需要下载 VirtualBox&lt;/li&gt;
&lt;li&gt;然后下载 VirtualBox： &lt;a href="https://www.virtualbox.org/wiki/Downloads" rel="nofollow" target="_blank" title=""&gt;VirtualBox 下载&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;我们还需要一个命令还工具：&lt;strong&gt;cmder&lt;/strong&gt;，&lt;a href="http://www.softpedia.com/get/Programming/Other-Programming-Files/Cmder.shtml#download" rel="nofollow" target="_blank" title=""&gt;cmder 下载&lt;/a&gt;
&lt;strong&gt;&lt;em&gt;cmder 很多 github 上得给的下载链接都失效了，我这个暂时是可用的&lt;/em&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://files.vagrantup.com/precise64.box" rel="nofollow" target="_blank" title=""&gt;vagrant 封装好的 Ubuntu 镜像&lt;/a&gt;我们把它叫做&lt;code&gt;ubuntu14.03-server-rails.box&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;当然还有我们喜爱的编辑器&lt;strong&gt;sublime text 3&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;都下载安装好之后，我们需要配置一下 cmder&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;下载好&lt;strong&gt;cmder&lt;/strong&gt;后，解压即可使用。只是这样使用很不方便，然后我们接着做以下操作&lt;/li&gt;
&lt;li&gt; 把 &lt;strong&gt;cmder&lt;/strong&gt; 加到环境变量：把 Cmder.exe 存放的目录添加到系统环境变量；加完之后，Win+r 一下输入 cmder，这样就可以启动 cmder&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;添加 cmder 到右键菜单&lt;/em&gt;&lt;/strong&gt;：在&lt;strong&gt;&lt;em&gt;命令提示符 (管理员)(A)&lt;/em&gt;&lt;/strong&gt;的终端中输入&lt;code&gt;Cmder.exe /REGISTER ALL&lt;/code&gt;，这样以后我们可以在任意文件点击鼠标右键可以看到&lt;strong&gt;&lt;em&gt;cmder here&lt;/em&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;到此为止&lt;strong&gt;&lt;em&gt;cmder&lt;/em&gt;&lt;/strong&gt;必须的配置已经搞定&lt;/p&gt;

&lt;p&gt;我们可以开工了。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;首先我们向虚拟机里面添加&lt;code&gt;ubuntu14.03-server-rails.box&lt;/code&gt;：
&lt;code&gt;vagrant box add ubuntu-rails ubuntu14.03-server-rails.box&lt;/code&gt;，ubuntu-rails 是生成系统的名字，这里我的 cmder 已经切换到&lt;code&gt;ubuntu14.03-server-rails.box&lt;/code&gt;所在的目录下&lt;/li&gt;
&lt;li&gt;接着在你工作的目录下进行一下操作
&lt;code&gt;mkdir workspace&lt;/code&gt;
&lt;code&gt;cd workspace&lt;/code&gt;
&lt;code&gt;mkdir ubuntu-rails&lt;/code&gt;
&lt;code&gt;cd ubuntu-rails&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;将本目录初始化化为 ubuntu 系统
&lt;code&gt;vagrant init ubuntu-rails&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;接下来可以直接启动系统了&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;启动系统
&lt;code&gt;vagrant up&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;登录系统
&lt;code&gt;vagrant ssh&lt;/code&gt;
到了这一步，你就可以看到，你的系统已经不再是你的 win 系统而是你的 ubuntu 系统&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;D:&lt;span class="se"&gt;\w&lt;/span&gt;orkspace&lt;span class="se"&gt;\u&lt;/span&gt;buntu-rails &lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt;
λ vagrant up
Bringing machine &lt;span class="s1"&gt;'default'&lt;/span&gt; up with &lt;span class="s1"&gt;'virtualbox'&lt;/span&gt; provider...
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; default: Clearing any previously &lt;span class="nb"&gt;set &lt;/span&gt;forwarded ports...
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; default: Clearing any previously &lt;span class="nb"&gt;set &lt;/span&gt;network interfaces...
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; default: Forwarding ports...
    default: 3000 &lt;span class="o"&gt;(&lt;/span&gt;guest&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 3001 &lt;span class="o"&gt;(&lt;/span&gt;host&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;adapter 1&lt;span class="o"&gt;)&lt;/span&gt;
    default: 22 &lt;span class="o"&gt;(&lt;/span&gt;guest&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 2222 &lt;span class="o"&gt;(&lt;/span&gt;host&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;adapter 1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; default: Running &lt;span class="s1"&gt;'pre-boot'&lt;/span&gt; VM customizations...
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; default: Booting VM...
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; default: Waiting &lt;span class="k"&gt;for &lt;/span&gt;machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; default: Machine booted and ready!
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; default: Checking &lt;span class="k"&gt;for &lt;/span&gt;guest additions &lt;span class="k"&gt;in &lt;/span&gt;VM...
    default: The guest additions on this VM &lt;span class="k"&gt;do &lt;/span&gt;not match the installed version of
    default: VirtualBox! In most cases this is fine, but &lt;span class="k"&gt;in &lt;/span&gt;rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default:
    default: Guest Additions Version: 5.0.8
    default: VirtualBox Version: 5.1
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; default: Configuring and enabling network interfaces...
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; default: Mounting shared folders...
    default: /vagrant &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; D:/workspace/ubuntu-rails
    default: /home/vagrant/workspace &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; D:/workspace/ubuntu-rails
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; default: Machine already provisioned. Run &lt;span class="sb"&gt;`&lt;/span&gt;vagrant provision&lt;span class="sb"&gt;`&lt;/span&gt; or use the &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nt"&gt;--provision&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; default: flag to force provisioning. Provisioners marked to run always will still run.

D:&lt;span class="se"&gt;\w&lt;/span&gt;orkspace&lt;span class="se"&gt;\u&lt;/span&gt;buntu-rails &lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt;
λ vagrant ssh
Welcome to Ubuntu 14.04.3 LTS &lt;span class="o"&gt;(&lt;/span&gt;GNU/Linux 3.19.0-25-generic x86_64&lt;span class="o"&gt;)&lt;/span&gt;

 &lt;span class="k"&gt;*&lt;/span&gt; Documentation:  https://help.ubuntu.com/

  System information as of Sat Dec 10 18:56:48 CST 2016

  System load:  0.74              Processes:           88
  Usage of /:   34.1% of 6.76GB   Users logged &lt;span class="k"&gt;in&lt;/span&gt;:     0
  Memory usage: 9%                IP address &lt;span class="k"&gt;for &lt;/span&gt;eth0: 10.0.2.15
  Swap usage:   0%                IP address &lt;span class="k"&gt;for &lt;/span&gt;eth1: 192.168.33.10

  Graph this data and manage this system at:
    https://landscape.canonical.com/

179 packages can be updated.
126 updates are security updates.

New release &lt;span class="s1"&gt;'16.04.1 LTS'&lt;/span&gt; available.
Run &lt;span class="s1"&gt;'do-release-upgrade'&lt;/span&gt; to upgrade to it.

Last login: Sat Dec 10 16:33:37 2016 from 10.0.2.2
vagrant@ubuntu:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;ls
&lt;/span&gt;workspace
vagrant@ubuntu:~&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;workspace/myblog/
vagrant@ubuntu:~/workspace/myblog&lt;span class="nv"&gt;$ &lt;/span&gt;rails s
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Booting WEBrick
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Rails 4.2.4 application starting &lt;span class="k"&gt;in &lt;/span&gt;development on http://localhost:3000
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Run &lt;span class="sb"&gt;`&lt;/span&gt;rails server &lt;span class="nt"&gt;-h&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;more startup options
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Ctrl-C to shutdown server
&lt;span class="o"&gt;[&lt;/span&gt;2016-12-10 18:58:40] INFO  WEBrick 1.3.1
&lt;span class="o"&gt;[&lt;/span&gt;2016-12-10 18:58:40] INFO  ruby 2.2.1 &lt;span class="o"&gt;(&lt;/span&gt;2015-02-26&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;x86_64-linux]
&lt;span class="o"&gt;[&lt;/span&gt;2016-12-10 18:58:40] INFO  WEBrick::HTTPServer#start: &lt;span class="nv"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2699 &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样我们的项目就跑起来了，不过这样跑起来，浏览器并不能与我们的服务互动。我们需要一点小操作：&lt;/p&gt;

&lt;p&gt;我们在启动服务的时候，不要用 localhost 这个主机&lt;/p&gt;

&lt;p&gt;我们需要指定主机
&lt;code&gt;rails s -b 0.0.0.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;这样服务跑起来是：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant@ubuntu:~/workspace/myblog&lt;span class="nv"&gt;$ &lt;/span&gt;rails s &lt;span class="nt"&gt;-b&lt;/span&gt; 0.0.0.0
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Booting WEBrick
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Rails 4.2.4 application starting &lt;span class="k"&gt;in &lt;/span&gt;development on http://0.0.0.0:3000
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Run &lt;span class="sb"&gt;`&lt;/span&gt;rails server &lt;span class="nt"&gt;-h&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;more startup options
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; Ctrl-C to shutdown server
&lt;span class="o"&gt;[&lt;/span&gt;2016-12-10 19:05:06] INFO  WEBrick 1.3.1
&lt;span class="o"&gt;[&lt;/span&gt;2016-12-10 19:05:06] INFO  ruby 2.2.1 &lt;span class="o"&gt;(&lt;/span&gt;2015-02-26&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;x86_64-linux]
&lt;span class="o"&gt;[&lt;/span&gt;2016-12-10 19:05:06] INFO  WEBrick::HTTPServer#start: &lt;span class="nv"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2710 &lt;span class="nv"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后我们可以在我们 windows 下的浏览器中访问我们的服务了
&lt;code&gt;http://localhost:3001&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="特别☆强调"&gt;特别☆强调&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;浏览器访问的时候用的端口是：&lt;/strong&gt;&lt;code&gt;3001&lt;/code&gt;
上面&lt;code&gt;vagrant up&lt;/code&gt;启动虚拟机的时候已经告知：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; default: Forwarding ports...
    default: 3000 &lt;span class="o"&gt;(&lt;/span&gt;guest&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 3001 &lt;span class="o"&gt;(&lt;/span&gt;host&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;adapter 1&lt;span class="o"&gt;)&lt;/span&gt;
    default: 22 &lt;span class="o"&gt;(&lt;/span&gt;guest&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 2222 &lt;span class="o"&gt;(&lt;/span&gt;host&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;adapter 1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="温馨提示"&gt;温馨提示&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;在 cmder 中切换 windows 下路径可以 &lt;code&gt;cd ..&lt;/code&gt;
不过如果更换根目录的时候需要类似 &lt;code&gt;cd /d D:\download&lt;/code&gt;这个&lt;code&gt;/d&lt;/code&gt;不可省略，或者用&lt;code&gt;pushd D:\download&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;下载好了&lt;strong&gt;&lt;em&gt;sublime text 3&lt;/em&gt;&lt;/strong&gt;之后我们需要实现 &lt;code&gt;subl .&lt;/code&gt;启动文件的功能&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;打开 Cmder 安装目录下的 config 文件夹下的 aliases 文件。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;在 aliases 中增加一行，添加别名。
&lt;code&gt;subl="D:\PROGRA~1\sublimeText3\sublime_text.exe"&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你的屏幕足够大或者你分辨率足够高你可以选择
&lt;code&gt;subl="D:\PROGRA~1\sublimeText3\sublime_text.exe" $1 -new_console:s50H&lt;/code&gt;这样你左边是终端，右边是 sublime&lt;/p&gt;

&lt;p&gt;&lt;em&gt;这样你已经可以很舒服地在 windows 下开发了，还有一些小细节，可以参考相关文献&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="未解决的问题"&gt;未解决的问题&lt;/h3&gt;
&lt;p&gt;第一次用这个 windows 下的 sublime，全局搜索快捷键&lt;code&gt;ctrl + shift + f&lt;/code&gt;，无法使用&lt;/p&gt;</description>
      <author>torvaldsdb</author>
      <pubDate>Sat, 10 Dec 2016 19:06:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/31872</link>
      <guid>https://ruby-china.org/topics/31872</guid>
    </item>
    <item>
      <title>回调 before_update 的误区</title>
      <description>&lt;h4 id="before_update"&gt;before_update&lt;/h4&gt;
&lt;p&gt;如果想在该回调函数中重新更新对象的属性，这时候要避免使用 update 或者 update_attributes, 换一个方法使用 update_column&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devdocs.io/rails~4.2/activerecord/persistence#method-i-update_columns" rel="nofollow" target="_blank" title=""&gt;update_column&lt;/a&gt;这个方法提供&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validations are skipped.(跳过验证)&lt;/li&gt;
&lt;li&gt;Callbacks are skipped.(跳过回调)&lt;/li&gt;
&lt;li&gt;updated_at/updated_on are not updated.(两个字段不再更新)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这样可以避免 before_update 的死循环。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;save(validate: false)&lt;/code&gt;可以跳过验证&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>torvaldsdb</author>
      <pubDate>Wed, 21 Sep 2016 15:50:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/31125</link>
      <guid>https://ruby-china.org/topics/31125</guid>
    </item>
    <item>
      <title>微信扫一扫功能如何实现?有没有大神分享一下心得?</title>
      <description>&lt;h5 id="已经拥有二维码, RC上有没有大神做过类似微信扫一扫的功能."&gt;已经拥有二维码，RC 上有没有大神做过类似微信扫一扫的功能。&lt;/h5&gt;</description>
      <author>torvaldsdb</author>
      <pubDate>Mon, 27 Jun 2016 16:37:20 +0800</pubDate>
      <link>https://ruby-china.org/topics/30375</link>
      <guid>https://ruby-china.org/topics/30375</guid>
    </item>
  </channel>
</rss>
