<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>zeekerpro (zeeker)</title>
    <link>https://ruby-china.org/zeekerpro</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>大家在开发 rails api 的时候是否遵循 jsonapi 规范</title>
      <description>&lt;p&gt;最近打算搞一个 rails API 前后端分离的项目，在使用 json 做数据交互的时候犹豫是否需要遵循&lt;a href="https://jsonapi.org/" rel="nofollow" target="_blank" title=""&gt;jsonapi&lt;/a&gt;规范，&lt;/p&gt;

&lt;p&gt;但是如果这样做的话就需要在后端做一次 serialize，然后数据到前端了还要做一遍 deserialize 的操作，这么做是否值得？&lt;/p&gt;

&lt;p&gt;我之前用 json API 规范开发过一个项目，个人觉得 jsonapi 的接口有几个优点：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;数据规范&lt;/li&gt;
&lt;li&gt;对于复杂关联的数据结构可以通过 relationships 和 included 节省数据传输大小。
例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model A {
  has_many: modelB
}

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正常查 modelA 列表，并 include model B 的时候，直接返回 json 的结构：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
  A1: {
     ...
    bs: [b1, b2, b3 ...]
  },
  A2: {
     ...
    bs: [b1, b2, b3 ...]
  }
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这时候如果 modelB 的属性多的话，b1, b2,b3 .. 等都会重复 to json，最后返回的 json 字符串就会很长。&lt;/p&gt;

&lt;p&gt;如果使用 jsonapi 规范做序列化，会得到下面的结构：  &lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data: [
  A1: {
    ...
    relationtships: {
      bs: [b1.id, b2.id, b3.id .....]
    }
  },
  A2: {
    ...
    relationtships: {
      bs: [b1.id, b2.id, b3.id .....]
    }
  }
],
included: [
  b1, b2, b3 ...
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 relationships 中只存了 relation 的 id，b1, b2, b3 都只做一遍序列化，然后存到 included 中&lt;/p&gt;

&lt;p&gt;但是缺点也很明显：后端序列化后，前端又要做一遍反序列化，感觉有点麻烦。&lt;/p&gt;

&lt;p&gt;不知道大家对于 jsonapi 规范是持什么态度，有踩过哪些坑么？&lt;/p&gt;

&lt;p&gt;另外，我目前用的数据序列化和反序列化的轮子：&lt;/p&gt;

&lt;p&gt;后端：&lt;a href="https://github.com/jsonapi-serializer/jsonapi-serializer" rel="nofollow" target="_blank" title=""&gt;jsonapi-serializer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;前端：&lt;a href="https://github.com/SeyZ/jsonapi-serializer" rel="nofollow" target="_blank" title=""&gt;jsonapi-serializer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;如果有比较好用的轮子也推荐一下。&lt;/p&gt;

&lt;p&gt;不遵守 jsonapi 规范的话，我就用的 jbuilder。&lt;/p&gt;</description>
      <author>zeekerpro</author>
      <pubDate>Fri, 22 Sep 2023 22:07:03 +0800</pubDate>
      <link>https://ruby-china.org/topics/43350</link>
      <guid>https://ruby-china.org/topics/43350</guid>
    </item>
    <item>
      <title>关于单表继承删除 super record 的问题</title>
      <description>&lt;p&gt;场景：teacher 和 people 是单表继承的关系，如下&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;People&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;Teacher&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;People&lt;/span&gt;
  &lt;span class="n"&gt;has_and_belongs_to_many&lt;/span&gt; &lt;span class="ss"&gt;:courses&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt; &lt;span class="ss"&gt;:join_table&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'teachers_courses'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当删除 people 时： &lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;people&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;People&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;
&lt;span class="n"&gt;people&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;destroy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对应的 Teacher.first 会被删除，但是 teacher 和 course 的关联关系不会被删除。&lt;br&gt;
目前我所知道的有两种办法可以解决这个问题&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. 直接使用 Teacher 来删除&lt;/span&gt;
&lt;span class="n"&gt;teacher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Teacher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;
&lt;span class="n"&gt;teacher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;destroy&lt;/span&gt;


&lt;span class="c1"&gt;# 2. 将user转换为Teacher&lt;/span&gt;
&lt;span class="c1"&gt;# https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-becomes&lt;/span&gt;
&lt;span class="n"&gt;people&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;People&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;
&lt;span class="n"&gt;teacher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;people&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;becomes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Teacher&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;teacher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;destroy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&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;Student&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;People&lt;/span&gt;
  &lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="n"&gt;xxxxxx&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样的话要删除一个 people 就太麻烦了，首先要去找所有的子类，然后找到关联关系，然后一个个解除 relationships，最后再删除 record。&lt;/p&gt;

&lt;p&gt;有没有现成的轮子或者通用的解决方案可以解决这种单表继承时，删除顶级 record，然后 record 自己检查继承类后删除对应关联的问题？&lt;/p&gt;</description>
      <author>zeekerpro</author>
      <pubDate>Sun, 03 Apr 2022 19:18:29 +0800</pubDate>
      <link>https://ruby-china.org/topics/42278</link>
      <guid>https://ruby-china.org/topics/42278</guid>
    </item>
    <item>
      <title>中文圈有没有关于 ruby 和 rails 的 discord 服务</title>
      <description>&lt;p&gt;就是想找个组织。。。&lt;/p&gt;

&lt;p&gt;但是没在 discord 上找到，如果搞一个维护会不会活跃得起来&lt;/p&gt;</description>
      <author>zeekerpro</author>
      <pubDate>Sat, 19 Mar 2022 20:27:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/42238</link>
      <guid>https://ruby-china.org/topics/42238</guid>
    </item>
    <item>
      <title>ActiveRecord 中如何将两个 scope 通过 or 条件合并成一个 scope</title>
      <description>&lt;p&gt;例如 一个 record 中有两个 scope&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
class User &amp;lt; ApplicationRecord

scope :onlines,  -&amp;gt; { where(:state =&amp;gt; 'online') }

scope :invisibles, -&amp;gt; { where(:state =&amp;gt; 'invisible') }

end

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在有一个新的 scope，需要用 or 条件将上述两个 scope 连起来&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scope :inlines_or_invisibles, lambda #onlines.or.invisibles#
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;求 inlines_or_invisibles scope 的写法。&lt;/p&gt;</description>
      <author>zeekerpro</author>
      <pubDate>Fri, 18 Mar 2022 12:04:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/42234</link>
      <guid>https://ruby-china.org/topics/42234</guid>
    </item>
    <item>
      <title>问一个关于在 rails scope 中 join 表查询设置时 where 条件的问题</title>
      <description>&lt;p&gt;有两个表，一个 user 表，一个 user 状态配置表，基本信息如下&lt;/p&gt;

&lt;p&gt;users&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/zeekerpro/b6ae1698-7b1c-4ce4-8f90-29c7a60f8e52.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;settings&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/zeekerpro/66e7af8d-6757-4859-ab9a-1a2407fc495a.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;users 表中的 attend_at 表示 user 注册加入的时间，activated_at 是用户激活账号的时间，激活以后才能正常使用&lt;/p&gt;

&lt;p&gt;settings 中的 activate_duration 限制用户成功加入后多少分钟内需要激活账号，超过则不允许激活&lt;/p&gt;

&lt;p&gt;比如 user1 的激活最晚时间就是 User.first.attend_at + 80.minutes&lt;/p&gt;

&lt;p&gt;需求是要列出现在（Time.now）还有激活机会的 users 有哪些。&lt;/p&gt;

&lt;p&gt;请问要实现这个需求，在 ActiveRecord 中使用 scope 应该怎么写？&lt;/p&gt;

&lt;p&gt;伪代码如下&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class User &amp;lt; ApplicationRecord
  belongs_to :settings

  scope :can_activates, -&amp;gt; {
    where(:activated_at =&amp;gt; nil).joins(:settings).where(:attended_at &amp;gt; # settings.activate_duration.minutes.ago # )
  }

end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;求解惑：scope 的 lambda 应该怎么实现？万分感谢🙏！&lt;/p&gt;</description>
      <author>zeekerpro</author>
      <pubDate>Thu, 17 Mar 2022 22:12:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/42229</link>
      <guid>https://ruby-china.org/topics/42229</guid>
    </item>
    <item>
      <title>如何使用 rubyXL 给 excel 添加批注</title>
      <description>&lt;p&gt;使用 rubyXL 读写 xlsx 文件，如何给 celll 添加一个 comment 呢？&lt;/p&gt;</description>
      <author>zeekerpro</author>
      <pubDate>Thu, 14 May 2020 14:41:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/39867</link>
      <guid>https://ruby-china.org/topics/39867</guid>
    </item>
    <item>
      <title>如何使用 fetch 发送 delete 请求</title>
      <description>&lt;p&gt;我尝试使用 fetch 给 rails 后台发送 delete 请求，如下所示
&lt;img src="https://l.ruby-china.com/photo/2019/dd8e9dcc-7ff7-41ca-a703-a02450ad86ca.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;路由如下：
&lt;img src="https://l.ruby-china.com/photo/2019/2e658d06-94df-4673-a699-864d8556ee6d.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;发送请求时报错如下：
&lt;img src="https://l.ruby-china.com/photo/2019/bc591f36-bbc7-4e6e-bd24-2bfd4491cfe8.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;这是什么问题导致的，该怎么解决。&lt;/p&gt;

&lt;p&gt;我的写法是参考这里：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/a-practical-es6-guide-on-how-to-perform-http-requests-using-the-fetch-api-594c3d91a547/" rel="nofollow" target="_blank"&gt;https://www.freecodecamp.org/news/a-practical-es6-guide-on-how-to-perform-http-requests-using-the-fetch-api-594c3d91a547/&lt;/a&gt;&lt;br&gt;
&lt;img src="https://l.ruby-china.com/photo/2019/f1c8eb73-542f-4783-9332-fe9fb375c116.png!large" title="" alt=""&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <author>zeekerpro</author>
      <pubDate>Wed, 10 Jul 2019 21:59:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/38826</link>
      <guid>https://ruby-china.org/topics/38826</guid>
    </item>
    <item>
      <title>如何单独使用 active_support 中的 autoload</title>
      <description>&lt;p&gt;查看了相关 active_support 关于 autoload 的相关解释和源码，然后自己试着用一下这个方法：&lt;/p&gt;

&lt;p&gt;文件目录结构如下&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;demo/
  | - main/
  |      | - base.rb
  |      | - scoping.rb
  | - main.rb
  | - run.rb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;代码如下：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#main.rb
require 'active_support/all'

ActiveSupport::Dependencies.autoload_paths.push('.', 'main')

module Main
  extend ActiveSupport::Autoload

  autoload :Base
  autoload :Scoping

end
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#main/base.rb
module Main
  class Base
    include Scoping
  end
end
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# main/scoping.rb
module Main
  module Scoping
    def hello
      "hello world"
    end
  end
end
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# run.rb
require 'main'

b = Main::Base.new
p b.hello
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当我在运行 ruby run.rb 时报错，提示信息为：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Traceback (most recent call last):
    7: from run.rb:1:in `&amp;lt;main&amp;gt;'
    6: from run.rb:1:in `require_relative'
    5: from  main.rb:19:in `&amp;lt;top (required)&amp;gt;'
    4: from /usr/local/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:291:in `require'
    3: from /usr/local/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:257:in `load_dependency'
    2: from /usr/local/lib/ruby/gems/2.6.0/gems/activesupport-5.2.3/lib/active_support/dependencies.rb:291:in `block in require'
    1: from /usr/local/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
/usr/local/lib/ruby/site_ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- main/base (LoadError)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我的理解是在 main.rb 中使用 ActiveSupport::Dependencies.autoload_paths.push('.', 'main') 将目录添加至 autoload_path 中，则使用 autoload 方法后，会在需要时自动加载 base.rb 和 scoping.rb。但是实际却加载失败了，请问是我理解错误，还是代码表达的时候写错了。该如何修正？&lt;/p&gt;</description>
      <author>zeekerpro</author>
      <pubDate>Fri, 10 May 2019 14:14:47 +0800</pubDate>
      <link>https://ruby-china.org/topics/38503</link>
      <guid>https://ruby-china.org/topics/38503</guid>
    </item>
    <item>
      <title>rails 新建 controller 时如何指定所继承的类</title>
      <description>&lt;p&gt;在组织代码的时候，admin 模块下创建了一个 Admin::BaseController &amp;lt; ActionController::Base&lt;/p&gt;

&lt;p&gt;我希望在使用 rails g controller 命令创建 Admin::UsersController 时继承 Admin::BaseController 而不是默认的 ApplicationController，请问命令该怎么写呢？&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;rails&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="n"&gt;controller&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="sc"&gt;??&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我知道可以手动改代码，但是不想每次生成了控制器以后都要改一遍，所以想找个简单的法子，希望老鸟们解惑一下。&lt;/p&gt;</description>
      <author>zeekerpro</author>
      <pubDate>Sun, 17 Mar 2019 16:32:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/38244</link>
      <guid>https://ruby-china.org/topics/38244</guid>
    </item>
  </channel>
</rss>
