<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>chenyunli (云莉)</title>
    <link>https://ruby-china.org/chenyunli</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>如何更换 RubyChina 账户的邮箱呢？</title>
      <description>&lt;p&gt;您好，之前注册 RubyChina 的邮箱已经不使用了，想更换邮箱，如何操作呢？&lt;/p&gt;

&lt;p&gt;如果邮箱不使用或者找不到了，忘记密码也难以找回账户了。我今天就输入很多次密码才想起来。。。点击忘记密码，也只有邮箱验证一种方式了。&lt;/p&gt;</description>
      <author>chenyunli</author>
      <pubDate>Fri, 30 Apr 2021 10:55:29 +0800</pubDate>
      <link>https://ruby-china.org/topics/41218</link>
      <guid>https://ruby-china.org/topics/41218</guid>
    </item>
    <item>
      <title>怎样在 RSpec 测试正在运行的时候，列出已经出错的 error messages，而不用等到所有的测试都运行完成</title>
      <description>&lt;p&gt;我记得 minitest 可以在 控制台 中用快捷键 &lt;code&gt;ctrl + t&lt;/code&gt; 查看正在运行的测试错误，但是 rsepc，查看不了，想请教一下大家有知道的么？不然运行测试，要等到所有测试都运行完才能查看到错误，太慢了。&lt;/p&gt;</description>
      <author>chenyunli</author>
      <pubDate>Thu, 16 Nov 2017 15:52:51 +0800</pubDate>
      <link>https://ruby-china.org/topics/34580</link>
      <guid>https://ruby-china.org/topics/34580</guid>
    </item>
    <item>
      <title>Rails 中 polymorphic 的使用, 以及获取 unscoped 对象属性</title>
      <description>&lt;p&gt;&lt;strong&gt;如果有什么错误之处，还请大神们指点。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;注意：本文小写的变量都为实例变量，如：&lt;code&gt;employee&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="使用 polymorphic"&gt;使用 polymorphic&lt;/h2&gt;
&lt;p&gt;场景： &lt;code&gt;Employee&lt;/code&gt; 和 &lt;code&gt;Product&lt;/code&gt; 都 &lt;code&gt;has_many pictures&lt;/code&gt;, 但是又不希望创建两个类似的 &lt;code&gt;pictures&lt;/code&gt; 表。也就是我们希望&lt;code&gt;Employee&lt;/code&gt; 和 &lt;code&gt;Product&lt;/code&gt; 可以同时关联上 &lt;code&gt;Picture&lt;/code&gt;, 最后能从 &lt;code&gt;pictures&lt;/code&gt; 表中各取所需，也可以在 &lt;code&gt;Picture&lt;/code&gt; 的每个实例对象中获得所属对象。最终结果：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rails 中&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pictures&lt;/span&gt;
&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pictures&lt;/span&gt;
&lt;span class="n"&gt;picture&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imageable&lt;/span&gt; &lt;span class="c1"&gt;# 是一个具体的 employee 或者 product 对象&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;存在表里的是：&lt;/li&gt;
&lt;/ul&gt;
&lt;table class="table table-bordered table-striped"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;name&lt;/th&gt;
&lt;th&gt;imageable_id&lt;/th&gt;
&lt;th&gt;imageable_type&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;sun&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;moon&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Employee&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&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;Picture&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="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:imageable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;polymorphic: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employee&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="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:pictures&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;as: :imageable&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Product&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="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:pictures&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;as: :imageable&lt;/span&gt;
  &lt;span class="n"&gt;default_scope&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="ss"&gt;published: &lt;/span&gt;&lt;span class="kp"&gt;true&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;class&lt;/span&gt; &lt;span class="nc"&gt;CreatePictures&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;Migration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;change&lt;/span&gt;
    &lt;span class="n"&gt;create_table&lt;/span&gt; &lt;span class="ss"&gt;:pictures&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;t&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;  &lt;span class="ss"&gt;:name&lt;/span&gt;
      &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;integer&lt;/span&gt; &lt;span class="ss"&gt;:imageable_id&lt;/span&gt;
      &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;  &lt;span class="ss"&gt;:imageable_type&lt;/span&gt;
      &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timestamps&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="n"&gt;add_index&lt;/span&gt; &lt;span class="ss"&gt;:pictures&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:imageable_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:imageable_id&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;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;注意事项&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;model&lt;/code&gt; 中的 &lt;code&gt;imageable&lt;/code&gt; 需要与表中的 &lt;code&gt;imageable_id&lt;/code&gt; 和 &lt;code&gt;imageable_type&lt;/code&gt; 对应，如果你的是 &lt;code&gt;object_id&lt;/code&gt; 和 &lt;code&gt;object_type&lt;/code&gt;，那么 &lt;code&gt;model&lt;/code&gt; 中应该是 &lt;code&gt;belongs_to :object, polymorphic: true&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="覆盖 Picture 中的 imageable"&gt;覆盖 Picture 中的 imageable&lt;/h2&gt;
&lt;p&gt;上述代码中，&lt;code&gt;Product&lt;/code&gt; 有 &lt;code&gt;scope&lt;/code&gt;，当你用 &lt;code&gt;picture.imageable&lt;/code&gt; 的时候，会把 scope 也带上，有可能你需要的是所有的 imageable，而不是 scope 下的，这个时候可以通过覆盖掉 imageable 这个方法来解决。&lt;/p&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;Picture&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="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:imageable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;polymorphic: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;imageable&lt;/span&gt;
    &lt;span class="vi"&gt;@imageable&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="n"&gt;imageable_type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constantize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unscoped&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_by_id&lt;/span&gt; &lt;span class="n"&gt;imageable_id&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;imageable_type&lt;/code&gt; 获取类名，&lt;code&gt;constantize&lt;/code&gt; 把字符串的类名转化为对象，再调用 &lt;code&gt;unscoped&lt;/code&gt; 方法，最后通过 &lt;code&gt;imageable_id&lt;/code&gt; 找到具体的 &lt;code&gt;imageable&lt;/code&gt; 对象。定义 &lt;code&gt;@imageable&lt;/code&gt; 是为了一次请求中不多次查询&lt;code&gt;imageable&lt;/code&gt;，因为 &lt;code&gt;rails&lt;/code&gt; 会缓存。 &lt;/p&gt;
&lt;h2 id="根据反馈做出调整"&gt;根据反馈做出调整&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;一开始文中写的是 scope，默认是不会被关联查出来的，现在改正过来了。&lt;/li&gt;
&lt;li&gt;最好不使用 default_scope&lt;/li&gt;
&lt;li&gt;如果非要使用 default_scope 可以用比文中更好一点的解决方法（文中的方法会导致 includes 无效等问题）：
&lt;code&gt;
belongs_to :imageable, (-&amp;gt; { unscoped }), polymorphic: true
&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>chenyunli</author>
      <pubDate>Wed, 25 Oct 2017 20:47:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/34429</link>
      <guid>https://ruby-china.org/topics/34429</guid>
    </item>
    <item>
      <title>把旧的数据库中的数据 load 到新数据库 (新数据库表字段有差异)</title>
      <description>&lt;h2 id="把旧的数据库中的数据 load 到新数据库(新数据库表字段有差异)"&gt;把旧的数据库中的数据 load 到新数据库 (新数据库表字段有差异)&lt;/h2&gt;
&lt;p&gt;注：我们的情景：以前是 php 的项目改成 rails 的项目，数据库也打算重新建一个。数据库都是 postgresql ,大体数据结构类似，但是 有表字段名字不同，字段类型不同，我们现在就是把原来的数据 搞到我们新的数据库中。然后应用能 work。对数据库不熟，所以没有选择数据库脚本做。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;安装 &lt;code&gt;gem 'yaml_db'&lt;/code&gt;&lt;br&gt;
照例： 
&lt;code&gt;Gemfile&lt;/code&gt; 中 加入 &lt;code&gt;gem 'yaml_db'&lt;/code&gt; 并 &lt;code&gt;bundle&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在旧的数据库环境下（database.yml 连接对应的数据库），运行 &lt;code&gt;rake db:data:dump&lt;/code&gt;,会生成文件 &lt;code&gt;db/data.yml&lt;/code&gt;。这个里面会把数据导出成数组格式。
如下：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="ss"&gt;users:
  columns:
  &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;nickname&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;updated_at&lt;/span&gt;
  &lt;span class="ss"&gt;records: 
  &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="vi"&gt;@a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;com&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'2016-10-25 11:35:41'&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'2016-10-25 14:26:11'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;安装 &lt;code&gt;gem 'bulk_insert'&lt;/code&gt;
照例： 
&lt;code&gt;Gemfile&lt;/code&gt; 中 加入 &lt;code&gt;gem 'bulk_insert'&lt;/code&gt; 并 &lt;code&gt;bundle&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在新的数据库环境下（修改 database.yml 连接对应的数据库），写 task，读取 &lt;code&gt;data.yml&lt;/code&gt; 文件，并写入新的数据库。
&lt;code&gt;rake -T&lt;/code&gt; 可以查看所有 rake 命令，找到自己的 rake 命令 并执行 (本例：&lt;code&gt;rake new_db:new_db_load&lt;/code&gt;)。&lt;/p&gt;

&lt;p&gt;task 代码：&lt;/p&gt;

&lt;p&gt;文件目录：&lt;code&gt;lib/tasks/new_db_migration.rake&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="ss"&gt;:new_db&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="s1"&gt;'migrate old db data to new db'&lt;/span&gt;
  &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;:new_db_load&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:environment&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;

    &lt;span class="n"&gt;old_db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;YAML&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'db/data.yml'&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;bulk_insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;set_size: &lt;/span&gt;&lt;span class="mi"&gt;100&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;worker&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;old_db&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s1"&gt;'records'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&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;record&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="ss"&gt;email: &lt;/span&gt;&lt;span class="n"&gt;record&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="ss"&gt;status: &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&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="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="ss"&gt;nick_name: &lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&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="ss"&gt;created_at: &lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;[&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;updated_at: &lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&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="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="nb"&gt;puts&lt;/span&gt; &lt;span class="s1"&gt;'user finish'&lt;/span&gt;

    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s1"&gt;'done!'&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;status&lt;/code&gt; ，原来是 0 或者 1，现在改成 true 或 false，通过 &lt;code&gt;status: (record[2] == 1)&lt;/code&gt; 操作来符合新的数据结构。其余的变更都可以类似处理。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>chenyunli</author>
      <pubDate>Tue, 25 Oct 2016 22:34:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/31437</link>
      <guid>https://ruby-china.org/topics/31437</guid>
    </item>
    <item>
      <title>全栈营感想</title>
      <description>&lt;h2 id="回想从得知全栈营到课程结束的心里路程"&gt;回想从得知全栈营到课程结束的心里路程&lt;/h2&gt;&lt;h2 id="得知全栈营"&gt;得知全栈营&lt;/h2&gt;
&lt;p&gt;我是从笑来老师的&lt;a href="http://xiaolai.li/2016/06/14/teach-yourself-without-permission/" rel="nofollow" target="_blank" title=""&gt;《你学你的，用不着别人批准》&lt;/a&gt;中得知全栈营的，呃，就最后一小段，被我看到了。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://ww3.sinaimg.cn/large/7853084cjw1f7or10njk4j2122059q44.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;看到这篇文章后，过几天我就辞职了。
因为，&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;我现在工作状态不太好，两年了一直没有突破&lt;/li&gt;
&lt;li&gt;刚读了&lt;a href="http://b.xinshengdaxue.com" rel="nofollow" target="_blank" title=""&gt;《七年就是一辈子》&lt;/a&gt;和&lt;a href="http://xiaolai.li/2016/06/14/teach-yourself-without-permission/" rel="nofollow" target="_blank" title=""&gt;《你学你的，用不着别人批准》&lt;/a&gt;，亢奋中&lt;/li&gt;
&lt;li&gt;可以和笑来老师一起学习？噫！&lt;/li&gt;
&lt;li&gt;一直想突破，想改变&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;当把我要去培训的这个事情说给我很多朋友后，他们都觉得我脑子进水了。因为对我们来说，一年也存不下 5 万。而我需要全部去借。不过也有人支持我，说，去吧，不然你又遗憾了。还有个朋友说，我自己不敢这样折腾，但是我很想看你折腾，然后看看究竟能折腾个什么出来。&lt;/p&gt;

&lt;p&gt;最后，我还是决定报名。其实，等着报名我也是心急火燎的，因为，自从在《你学你的，用不着别人批准》这篇文章中看到过后，李笑来老师的微博、公众号里面根本没有什么动静，我以为就是说说，因为毕竟事起于他在微博上说的一句话，然后被攻击。为此我还专门去新生大学的客服去问。然后让他们一有报名方式公布，赶快打电话给我。（后来真的打给我了，可是这个报名好像不是他们负责，我觉得他们真的是很棒，还给这个客服发了条短信感谢，她也回复说了些鼓励我的话，嗯，心里觉得，自己真是选择对了）&lt;/p&gt;

&lt;p&gt;之后就是去借钱了，甚至想到过信用卡套现；（得想好这个钱怎么凑，这是我这两年的经验，以至于前两天还和老师同学们分享了我的“借钱经验”）
最后，因为有一个朋友和老妈的支持，大头都借到了。然后坐等。&lt;/p&gt;

&lt;p&gt;报名消息一公布，我就开始填报名表，填了之后，我的妈呀，又得等一周，才能知道自己会不会被录取。。。（我晕，火急火燎的等着）&lt;/p&gt;
&lt;h2 id="开课前"&gt;开课前&lt;/h2&gt;
&lt;p&gt;是一个周二公布的录取结果，好吧，没有我，我挺难过的（因为我一直积极“准备”着；我也要用这个学来的表情符号表达情感！！！相反的 XDDDD！！！好么）。
周三周四，我赶紧接着去找工作了（之前辞掉，已经两三周没有工作了），周五拿到了 offer，正准备去入职。居然戏剧般的情景又出现在了我的生命里。（好吧，现在我都在感谢，那最后没有去上课的人，给我缺下来的名额；也在唏嘘，是不是上天感到了我的真诚）&lt;/p&gt;

&lt;p&gt;戏剧就是居然有人被录取了，但因为个人原因没去，缺 3 个名额，补录名单有我的名字！好吧，赶紧四处凑钱（虽然之前都已经说好，但是并没有打款到我的账上。）看到以报名时间确定最终录取名单，和只差 3 个名额。我着实急了一把（马不停蹄借钱）。最终，付费成功。当然也把 offer 辞掉了。&lt;/p&gt;

&lt;p&gt;报名成功之后被告知有课前任务，我又开始买 mac（从不敢瞻仰这么贵的电脑，官网免息分期），环境配置（从不知道安装用一句命令行就搞定），初级教材，中级教材练习 3 遍（从不知道原来命令行开发这么爽，做的时候，去查了 touch 这个命令是什么，好吧，有一回答说：一看就是个小白）。&lt;/p&gt;

&lt;p&gt;把这些准备工作都做好，我熟悉了 mac，shell（终端），github 的基本操作，部署到 heroku，也大概知道 ruby 的开发流程了。这期间变化已经够大了，从上面括号里面的几个从不就可以看出来。（心理很得意的 XDDDD！！！）&lt;/p&gt;

&lt;p&gt;我记得有一个朋友说，你这一跟着全栈营，逼格不知道提升了多少。（好吧，以前的我白痴和土到不是一般人）&lt;/p&gt;
&lt;h2 id="开课后"&gt;开课后&lt;/h2&gt;
&lt;p&gt;第一天，我貌似 9:40 到的班级，老师等着班里迟到还没有来的人；后来很少有迟到的，有可能第一天大家探路吧。来到班级，带着花了 5 万（关键全是借的！），并感觉会改变命运的“赌博”心理来的。因为，我周围的人都觉得我脑子进水了（这么贵的钱 5 万，这么短的时间 2 个月）。但是，我内心是很坚定的，因为，我相信更好的学习方式和更牛的“教练”，5 万会值得，2 个月不短。（另外，我喜欢新鲜事物和改变）
第一天的感觉还有一个就是，我一个人不认识，但是之前做任务的时候有同学跟我私聊过，然后就开始找，他在哪，呃，找到了一个说过话的人（虽然是 slack 上），心理好多了。&lt;/p&gt;

&lt;p&gt;其实，一开始我并没有发觉老师教学的价值（可能是我花了我难以承受的钱，希望一瞬间就能赚回来的心理？）和之前我参加的培训很不一样，老师很少讲课，都是实战。但是，我读过老师的文章： &lt;/p&gt;

&lt;p&gt;&lt;a href="http://smalltalk.xdite.net/posts/771703-drop-arrogant" rel="nofollow" target="_blank" title=""&gt;放下你的無效學習方式&lt;/a&gt;
&lt;a href="http://smalltalk.xdite.net/posts/745611-that-golden-channel-of-learning" rel="nofollow" target="_blank" title=""&gt;領悟「學習的黃金通道」&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;而且，我是知道自己并不知道，所以也傲慢不起来。就乖乖听老师的话。因为开课前老师布置的任务都很认真的完成，加上自己有一定的基础，一路上并没有什么曲折。不过我也是亲眼看见了 0 基础同学们的进步多么巨大。（这个变化，让我惊讶，因为，别的都先不说，怎么 0 基础这么两周就会开发网站了！呃呃，我真的不敢不承认这价值了。。。）&lt;/p&gt;

&lt;p&gt;并且可以明显看到，认真思考，按照老师的学习方法走的人，进步都很大（这一点不假）。以至于我自己都开始惭愧，因为毕竟我有别的编程语言的经验，我有时感觉自己还不如他们！（这个感觉，持续到课程结束。我怎么可能傲慢，反而都是惭愧；因为我更能感知到这变化，对于从没接触到编程的人来说，有可能不知道老师让他们升级了多少。对，让我有两年 java 开发经验的人惭愧）&lt;/p&gt;

&lt;p&gt;不过，一开始还有一个我不解的地方，就是老师几乎不怎么讲基础知识，除了每天答疑的那些。很少挑出来基础概念长篇大论的讲，这在之前我培训过的地方是很不一样的。因为他们都是首先讲很多基础理念。从语法，数据类型，变量，条件选择，循环结构等等一步步往后讲。但是，Xdite 老师根本一步也没有这样走。我很担心他们基础知识是否扎实。
后来，我总结了一下，Xdite 老师更希望我们获得的是自学能力，解决问题的能力。什么小知识不会了，就让我们 google，还鼓励我们在 github 上提 issue，并在 issue 下面把查到的、问到的答案或者她最后给解答过的，最后都整理成文字，回复到问题下面，有的还要求写成 wiki。她是用让我们主动参与，自己动手的方式去掌握基础知识。（自己查阅，总结并分享给大家）
另外，奖励的小机制，也让大家比较踊跃的提问题，写总结。（呃，我们组没有得到最后的最高分，没有拿到奖品。。。哭）&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;第四周开始&lt;/strong&gt;
开始产品用户调查，投票选择项目，分为四组，开始实际做一个真实项目。
这个方式的开设，我之前是不懂的，现在回想起来，感觉 Xdite 老师用心良苦吧。因为，只有在实践中才能遇到最真实的问题，同学们自己从无到有做出来一个完整的项目；选择小组长，写用户故事，分配任务，tower 上管理项目，协作开发，每天的 stand up 会议，一切都跟真实工作似的。让我们不止明白什么是网站开发，也明白什么是优质的团队协作。而在真实的“工作”中，我们才明白自己需要会什么，怎么样解决问题，更包括了怎么样达成更好的团队协作。这个方案的神奇效果，真是让我又吃一惊。因为，同样是之前的传统培训没有的，他们那样的培训一开始接触公司真实项目是有些困难和不知所措的。（我就是这样过来的），但现在这样，我相信，大家进入公司之后，会很容易融入团队并快速开始工作。&lt;/p&gt;

&lt;p&gt;当然，只要牵扯到团队协作，总也会遇到些协作上的问题，不过最后总能协调并突破（通过老师协调，同学之前的坦诚交流等）。我想这是提前给我们进入工作彩排了一次，在之后的职场中，我们肯定会吃一堑长一智，更轻松的应对团队关系。&lt;/p&gt;

&lt;p&gt;你不得不承认这个班里的人，都是“聪明”、有自己思想的人。我心里很佩服他们，佩服每一个人的优秀；我们都是一群有目标的人。在这样的环境里待着，你每天都是进步的，每天都是打鸡血般的。
如果这样说，我想，不用我形容什么，这氛围中带来的力量就已经够你吃惊了，它给你带来的也许是你无法想象的思想冲击。&lt;/p&gt;
&lt;h2 id="我最大的变化"&gt;我最大的变化&lt;/h2&gt;
&lt;p&gt;上面说的似乎都是关于我对这个课程一步步的认可和思考。
下面我说一说对我影响最大的事情。&lt;/p&gt;

&lt;p&gt;首先，我看到了，&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;比我有钱，比我优秀的人都比我更努力！&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;而且他们更不容易被别的因素干扰。更容易成功。其实，这对于来自农村的我，对于苦难是一笔宝贵财富的理解是更深一层的。
如果，苦难让你更坚强，更进步，这苦难真的是一笔财富；
如果，苦难让你更悲观，更容易自卑和受挫折，这苦难有可能局限住自己；
而且我发现，经常生活在幸福中的孩子，幸福感一直存在。他们眼界更高，他们不受经济约束太多，他们可以用上我觉得很昂贵的工具（mac），他们会为软件付费。
（通过他们，我还学到了理财，知道了很多升级认知的课程，很多很多！）&lt;/p&gt;

&lt;p&gt;而我呢？从来不敢瞻仰有一台 mac，从来见着付费软件都躲得远远的。
因为我穷，我一直躲避任何花钱的事物。这带来的后果是，我有可能会错过很多很多的体验。而且有可能最后成为思维惯性，我“有钱”了，也不敢花钱。也永远不会体验到付费的优质服务和效果。&lt;/p&gt;

&lt;p&gt;另外，之前看过一篇文章：人丑要多读书；里面有个有趣的问题，当你看到比你漂亮 N 倍，比你气质好，比你有钱，读的书比你多，还比你更努力的人，你怎么想？
呜哇哇～，我真是不敢想了。是的，这样的人真的不少！
所以，我真的没有任何理由再去逃避，再去伤悲了！&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;你眼中的大牛有可能比你想象的还要牛 N 倍！&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;当你尝试去做任何一件他们做成的“小事情”的时候，你就知道这个“小事情”的“简单”程度不像你原来想的那样简单。比如，试试一直坚持写作、写博客。或者试试任何你认为令你赞叹的事情。（如果你真的也能做到，其实你也会被赞叹，哇，大牛！）&lt;/p&gt;

&lt;p&gt;而且，做成功过一件事情，做另外一件事情成功的可能性是更高的！从我看到牛人分享他们的故事中就可以总结到。（Xdite 老师的成长曲线，就更不是想象般的速度了，神速！以至于老师自己就说：“不要追赶我，我比一般人更努力，更狠”）&lt;/p&gt;

&lt;p&gt;Xdite 老师有时候心情一好，会分享很多有用的人生经验，以至于后来一听见她说话，自己没听到，都感觉错过了什么宝贝似的。而且，她说话永远都是热情洋溢，激情四射，很有感染力。在她身边，我想我是蔫不起来，而是一直亢奋。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;懂的思考的人进步更快&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;我看到编程 0 基础的同学，只要他善于思考，那么他肯定也是特别主动，并且喜欢承担责任的人。这样的同学，我觉得想不进步都难。一开始，他们跟着老师入门的时候，会听老师的先模仿，而且这个方法真的是很必要的，就像 Xdite 老师说的，模仿是开始学习一样东西最好的一步，因为让你少走很多弯路，并且容易成功，从而不会很快受挫，最后，真的就成功了！等入门了，就开始慢慢深入思考了，主动型的，会思考的人受益就更大了，因为他们自己会找到自己不会的地方，不断思考并找到答案。在项目协作中，也能思考的比较多，不断的补充意见，积极参与，并不断优化产品。我时常想，如果我未来的同事是他们，那一定会超级爽的。因为，如此和谐，项目推进的也很好。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;这两个月的消费水平&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;5 万的学费，反正对于我这样的穷屌丝，真是十分的大。
14800 的 mac 电脑，居然我还付费买了软件（Mweb）
课程结束后，大多数人都会去参加成都的 RubyConf；（机票，住宿）&lt;/p&gt;

&lt;p&gt;好吧，从来没有坐过飞机的我，也买了机票。当付了 1000 多快的（单程）机票后，我真真的是急哭了，因为我瞬间想到了刚到北京时只吃包子或者饼的时候了（因为包子和饼一两块就能买到，一份盖饭或面条要十几块）；真的是不舍得而且没钱。
也许你好奇，为什么 5 万的学费我花的还是很大方的，毕竟我很积极利索的借钱来到这个班不是？其实，我有一点比较好的，就是投资自己的钱，花下去从不眨眼。比如学习上，之前培训 java，贷款最后加利息还了快两万，报尚德机构，我也是花了一万。所以，这次是花在交通上 1000 块（还只是单程）我怎么可能舍得，你和我平时花费比就知道了，来这个班，中午管饭，我早晚餐加起来 10 块钱都花不了，晚上有时候就不吃了。平时除了地铁费，几乎不花钱。以前我买了一件贵的衣服，也会心疼好几天，但是只要花在学习上，几乎不会心疼。&lt;/p&gt;

&lt;p&gt;尤其是这次如此超过我消费能力的消费，给我带来的最大的好处，是让我真正明白什么叫做“付费就是捡便宜”。体验了 mac 的炫酷，一批优秀的软件，让我更加热爱编程，爱上写文章。不夸张的说，我一天不在这上面写点东西，都觉得不舒服了。就算真的没写，也会心里内疚一下，今天没有写点什么。。。（当然肯定不光是工具好用，流畅，就爱上写文章，和 Xdite 老师让我们写日记写技术博客养成的习惯有很大关系的啦～）
我想如果不是这次课程，我得多少年后才能体验上？而且我相信，以后我的消费观念肯定会不一样。而且，这次花钱如滴血的经验，让我以后还有什么事是让我不敢花钱的？&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;两个月来的学习氛围和资源&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;我想我以后是不可能变成一个不追求进步，安逸于现状，整天处于无聊状态，没思想的人的。&lt;/p&gt;

&lt;p&gt;之前听过一个名人名言，我刚刚去 google 查了，好好看一下，因为我一直渴望这样的状态：&lt;/p&gt;

&lt;p&gt;&lt;em&gt;著名记者怀特·霍布斯说：“成功就是当你醒来，无论身在何处，无论年龄多大，你很快从床上弹起，因为你迫不及待地想去做你爱做的、你深信的、你有才华做的工作。”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;虽然，我现在不是成功，但是，我到了那种，早上从床上弹起的状态！
因为我迫不及待的要去做我爱做的、我深信的、我有才华做的工作！&lt;/p&gt;

&lt;p&gt;我认为，是受到这里的氛围感染，和我想不到的各种资源把我带入这种状态的。（我一直渴望的状态，可想而知，其实我的心理是多么的嗨皮的～）&lt;/p&gt;
&lt;h2 id="最后的总结"&gt;最后的总结&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;让一个人完全改变了生活状态吧。
虽然我还是我，但已经相差甚远；
也许我之前也是一个愿意思考和愿意进步的人，但是，来到这里我坚定了这样的目标和生活&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;就像新生大学公众号每篇文章后面有的那个动态的图显示的内容一样：
孤独，烦躁，焦虑，迷茫，自卑（哭脸）（到有了大家）相信我，你并不孤独（笑脸）；
这个过程和我有了全栈营的同学是一样的，这就是我最大的转变，最大的收获&lt;/em&gt;&lt;/p&gt;</description>
      <author>chenyunli</author>
      <pubDate>Tue, 13 Sep 2016 19:27:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/31062</link>
      <guid>https://ruby-china.org/topics/31062</guid>
    </item>
  </channel>
</rss>
