<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>spfzzz (石朋飞)</title>
    <link>https://ruby-china.org/spfzzz</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>rails 里面的枚举类型</title>
      <description>&lt;p&gt;在 rails 的枚举为什么将 false 转化为 nil??????&lt;/p&gt;

&lt;p&gt;当在 model 里面使用 enum 时，其他的时候都比较方便，例如：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;enum&lt;/span&gt; &lt;span class="ss"&gt;status: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="ss"&gt;created: &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;applied: &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;approved: &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;published: &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;cancel: &lt;/span&gt;&lt;span class="mi"&gt;10&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;各种查询，更新 status 字段都非常的方便！！！
##可是当使用布尔类型时......
&lt;img title=":sob:" alt="😭" src="https://twemoji.ruby-china.com/2/svg/1f62d.svg" class="twemoji"&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;Admin::Operator&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="o"&gt;...&lt;/span&gt;
  &lt;span class="n"&gt;enum&lt;/span&gt; &lt;span class="ss"&gt;enabled: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;enabled: &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;disabled: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt; &lt;span class="p"&gt;}&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;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Admin&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Operator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;last&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disabled!&lt;/span&gt;
&lt;span class="no"&gt;Admin&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Operator&lt;/span&gt; &lt;span class="no"&gt;Update&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.6&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;UPDATE&lt;/span&gt; &lt;span class="sb"&gt;`admin_operators`&lt;/span&gt; &lt;span class="no"&gt;SET&lt;/span&gt; &lt;span class="sb"&gt;`enabled`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sb"&gt;`updated_at`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'2019-05-30 13:35:17'&lt;/span&gt; &lt;span class="no"&gt;WHERE&lt;/span&gt; &lt;span class="sb"&gt;`admin_operators`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="sb"&gt;` = 1
   (0.2ms)  ROLLBACK
Traceback (most recent call last):
        1: from (irb):20
ActiveRecord::NotNullViolation (Mysql2::Error: Column 'enabled' cannot be null: UPDATE `&lt;/span&gt;&lt;span class="n"&gt;admin_operators&lt;/span&gt;&lt;span class="sb"&gt;` SET `&lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="sb"&gt;` = NULL, `&lt;/span&gt;&lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="sb"&gt;` = '2019-05-30 13:35:17' WHERE `&lt;/span&gt;&lt;span class="n"&gt;admin_operators&lt;/span&gt;&lt;span class="sb"&gt;`.`&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="sb"&gt;` = 1)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;rails 把布尔类型的 false 转换成了 nil，就有点懵逼了！！！！寻寻觅觅发现原来你在这里&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#activerecord-5.2.2.1/lib/active_record/enum.rb&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;##这里的问题！！！！！！！！！！！！！！！！！&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blank?&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has_key?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt;
        &lt;span class="k"&gt;elsif&lt;/span&gt; &lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has_value?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
          &lt;span class="n"&gt;assert_valid_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&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;p&gt;##如果把 return if value.blank？去掉不是更好吗？为什么 rails 会将 false 转化为 nil???????????&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;ActiveRecord&lt;/span&gt;
  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Enum&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EnumType&lt;/span&gt;
      &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;EnumCast&lt;/span&gt;
        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;key?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;value?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

          &lt;span class="n"&gt;assert_valid_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&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="n"&gt;prepend&lt;/span&gt; &lt;span class="no"&gt;EnumCast&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;</description>
      <author>spfzzz</author>
      <pubDate>Thu, 30 May 2019 14:36:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/38589</link>
      <guid>https://ruby-china.org/topics/38589</guid>
    </item>
    <item>
      <title>mysql 为什么不走索引？</title>
      <description>&lt;p&gt;在家闲来无聊，发现下面的 SQL 不走索引，哪位大神帮忙解释一下....&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create Table: CREATE TABLE `catalogs` (
  ....
  `catalog_type` varchar(255) NOT NULL DEFAULT '' COMMENT 'type of catalog',
  `parent_id` int(11) NOT NULL DEFAULT '0' COMMENT 'the parent''s id',
  `status` int(11) NOT NULL DEFAULT '0' COMMENT 'status of catalog',
  .....
  KEY `index_catalogs_on_catalog_type_and_status_and_parent_id` (`catalog_type`,`status`,`parent_id`)
) ENGINE=InnoDB AUTO_INCREMENT=108 DEFAULT CHARSET=utf8
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/13956d5e-11d5-423e-9777-111626a7b1b9.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;正如上面执行的结构，Mysql 的 InnerDB 不是最左匹配原则吗？&lt;strong&gt;&lt;em&gt;为什么 SQL 查询时 catalog_type 的为 user-menu 时，不走索引而是全表扫描？而为 user_menu 时走索引了？&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;</description>
      <author>spfzzz</author>
      <pubDate>Fri, 16 Nov 2018 14:14:22 +0800</pubDate>
      <link>https://ruby-china.org/topics/37775</link>
      <guid>https://ruby-china.org/topics/37775</guid>
    </item>
    <item>
      <title>给已存在的类添加类方法和实例方法</title>
      <description>&lt;h3 id="《Ruby的原理解析》里有记载："&gt;《Ruby 的原理解析》里有记载：&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;1.每个 Ruby 对象都是类指针和实例变量数组的组合。
2.Ruby 类是包含方法定义、属性名称、超类指针和常量表的 Ruby 对象。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;今天参加了面试，虽然 out 了，还是做点记录吧。。。&lt;strong&gt;给类添加实例方法和类方法的方式有很多种，不知道面试官为什么对已存在的类情有独钟？？？&lt;/strong&gt;
也就是说，类的对象只保存了 self 指针和对象中的实例变量值的数组（或者是散列表：实例变量名为键，实例变量为值）；类的实例方法是保存在类中的（底层是 C 语言实现的 RClass）。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;那么 Ruby 的类方法是保存在哪呢？&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;答案是类的单例类中。&lt;/strong&gt;&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;Storage&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Methods&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;abc&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;
    &lt;span class="s2"&gt;"abc_methods"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;Storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;singleton_class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_eval&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Methods&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;Storage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_eval&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Methods&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/d26fbfc8-fe5a-4760-a2cb-87741ed40a87.png!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2018/31d0373b-b175-4069-bec3-bb0040fe5fbd.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="代码中的puts self的输出证明方法已经是类方法或者是实例方法了。"&gt;代码中的 puts self 的输出证明方法已经是类方法或者是实例方法了。&lt;/h3&gt;
&lt;p&gt;至于 Ruby 为什么要把类方法单独放在单例类中，这样做有什么好处就不清楚了。难道是因为类中保存的东西太多，把类方法分离出去放在单例类中减少使用的内存吗？&lt;/p&gt;</description>
      <author>spfzzz</author>
      <pubDate>Wed, 07 Nov 2018 19:50:59 +0800</pubDate>
      <link>https://ruby-china.org/topics/37737</link>
      <guid>https://ruby-china.org/topics/37737</guid>
    </item>
    <item>
      <title>rails5.1.6 production 环境下 server 和 console 的区别和疑问</title>
      <description>&lt;p&gt;前世今生：一直没有接触过线上环境，自己就在阿里云上买了服务器和域名，自己从 0 开始搭建 ruby On rails 环境:
  1.使用 nginx 做代理，强制使用 https 协议（ssl 免费证书）
    &lt;img src="https://l.ruby-china.com/photo/2018/f03cbde6-2e0d-43b3-8a4f-e9df9a07829f.jpg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;unicorn 做服务器
&lt;img src="https://l.ruby-china.com/photo/2018/125c57b7-25db-4a7c-bf92-d143fbce0ed3.png!large" title="" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;ar-octopus 做读写分离，主从使用的是同一个数据库
&lt;img src="https://l.ruby-china.com/photo/2018/4bf9a935-8c1d-445d-9048-f1faf48b4630.png!large" title="" alt=""&gt;
&lt;/li&gt;
&lt;li&gt;capistrano 部署&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;一切准备好后，在本地执行 cap production deploy 和 cap production unicorn:start 部署和启动 unicorn&lt;/p&gt;
&lt;h3 id="遇到的问题："&gt;遇到的问题：&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;production 环境下的 console 查询的最新一条记录和 server 查询的最新一条记录不同步&lt;/strong&gt;
&lt;strong&gt;console 下查询的最新记录 id 是 24，server 下最新记录 id 是 23&lt;/strong&gt;
production 下的 server 和 console 的区别是什么？加载的配置项不一样吗？
&lt;img src="https://l.ruby-china.com/photo/2018/4b42dddd-f174-4b24-aa37-1557c0753fa3.png!large" title="" alt=""&gt;
查看 production 环境下日志：
tail -f log/production.log
&lt;img src="https://l.ruby-china.com/photo/2018/5d554564-0916-4bf5-b052-8ebbd650a25a.png!large" title="" alt=""&gt;
&lt;strong&gt;部署的环境问题&lt;/strong&gt;
明明执行的命令是 cap production unicorn:start，为什么 unicorn 后面-E 的参数时 deployment？？？？
&lt;img src="https://l.ruby-china.com/photo/2018/3d5f4268-9ad0-4596-8bf3-798470804c7a.png!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>spfzzz</author>
      <pubDate>Sat, 29 Sep 2018 10:40:56 +0800</pubDate>
      <link>https://ruby-china.org/topics/37571</link>
      <guid>https://ruby-china.org/topics/37571</guid>
    </item>
    <item>
      <title>一个 rails console 的问题</title>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Gemfile 文件里指定 redis-objects, redis-namespce&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gem list 列表里显示已经安装&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;郁闷的是执行命令 bundle exec rails console 后，redis-namespace 和 redis-objects 并没有 require 进 console&lt;/strong&gt;。。。。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/18df03259bb7fada5d9a5f9f78164ee3.png!large" title="" alt=""&gt;
4.&lt;strong&gt;在 console 里面执行下面代码，require 的 gem 明显比 Gemfile 里的 gem 少&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Bundler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;require&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;g&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2017/387629e3aa54c314dcc005a5a039e4c5.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Gemfile 文件如下&lt;/strong&gt;
&lt;img src="https://l.ruby-china.com/photo/2017/3abc01700829d44b4789d60974929fcd.png!large" title="" alt=""&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>spfzzz</author>
      <pubDate>Fri, 10 Mar 2017 19:03:44 +0800</pubDate>
      <link>https://ruby-china.org/topics/32501</link>
      <guid>https://ruby-china.org/topics/32501</guid>
    </item>
  </channel>
</rss>
