<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>brookepowell (Brooke Powell)</title>
    <link>https://ruby-china.org/brookepowell</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>关于 Rails+Postgresql 的 Array 字段问题</title>
      <description>&lt;p&gt;数据库是 postgresql, 在&lt;code&gt;articles&lt;/code&gt;表中创建了&lt;code&gt;Array&lt;/code&gt;类型的字段&lt;code&gt;tag_ids&lt;/code&gt;，接收数组类型的标签 id。&lt;/p&gt;

&lt;p&gt;在网页上进行添加记录操作时，&lt;code&gt;text_field&lt;/code&gt;中的值为字符型&lt;code&gt;1,3,5&lt;/code&gt;，在进行&lt;code&gt;create&lt;/code&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;ArticlesController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;new&lt;/span&gt;
    &lt;span class="vi"&gt;@article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;
    &lt;span class="vi"&gt;@article&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Article&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;allowed_params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# 处理tag_ids为数组，再赋值一次&lt;/span&gt;
    &lt;span class="c1"&gt;# 如果不这样处理，tag_ids在数据库中的值会被错误解析&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;allowed_params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:tag_ids&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;allowed_params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:tag_ids&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;present?&lt;/span&gt;
      &lt;span class="vi"&gt;@article.tag_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;allowed_params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:tag_ids&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;","&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;compact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uniq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ss"&gt;:to_i&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;if&lt;/span&gt; &lt;span class="vi"&gt;@article.save&lt;/span&gt;
      &lt;span class="n"&gt;redirect_to&lt;/span&gt; &lt;span class="n"&gt;articles_path&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;:new&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="kp"&gt;private&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;allowed_params&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;require&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="nf"&gt;permit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:tag_ids&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;请问有没有更优雅的方式处理参数？&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;已解决：&lt;/p&gt;

&lt;p&gt;还是通过修改前端提交的参数类型为数组解决了，这样比较优雅些。&lt;/p&gt;</description>
      <author>brookepowell</author>
      <pubDate>Thu, 17 Mar 2022 22:33:41 +0800</pubDate>
      <link>https://ruby-china.org/topics/42230</link>
      <guid>https://ruby-china.org/topics/42230</guid>
    </item>
    <item>
      <title>关于 Rails 的多数据库事务</title>
      <description>&lt;p&gt;rails6 支持多数据库以来，发现使用&lt;code&gt;ActiveRecord::Base.transaction&lt;/code&gt;来处理跨数据库的事务时，不起作用。&lt;/p&gt;

&lt;p&gt;出现异常后也不会全部 rollback。&lt;/p&gt;

&lt;p&gt;请问在这种情况下有没有什么别的方法解决这个问题？&lt;/p&gt;</description>
      <author>brookepowell</author>
      <pubDate>Fri, 03 Sep 2021 21:53:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/41652</link>
      <guid>https://ruby-china.org/topics/41652</guid>
    </item>
    <item>
      <title>超过 1 千万条数据，如何快速从 mysql 导入到 elasticsearch 中?</title>
      <description>&lt;p&gt;如题，有开源解决方案更好，希望知道的朋友推荐一下，谢谢。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;已找到导入工具：&lt;a href="https://github.com/appbaseio/abc" rel="nofollow" target="_blank" title=""&gt;abc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;只需要执行一条命令：&lt;code&gt;abc import --src_type=mysql --src_uri="USER:PASS@tcp(HOST:PORT)/DBNAME" "https://USER:PASS@ES_HOST:PORT/INDEX_NAME"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;即可导入，速度非常快，1000 万条数据导入用了不到 10 分钟。&lt;/p&gt;</description>
      <author>brookepowell</author>
      <pubDate>Wed, 03 Mar 2021 12:52:00 +0800</pubDate>
      <link>https://ruby-china.org/topics/40983</link>
      <guid>https://ruby-china.org/topics/40983</guid>
    </item>
    <item>
      <title>IRB 彩蛋</title>
      <description>&lt;p&gt;需要 ruby 大于等于 2.7&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;irb
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;IRB&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt; &lt;span class="ss"&gt;:easter_egg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:dancing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>brookepowell</author>
      <pubDate>Fri, 05 Feb 2021 13:19:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/40893</link>
      <guid>https://ruby-china.org/topics/40893</guid>
    </item>
    <item>
      <title>大家在 Rails 项目中使用 Docker 时，开发期间也会使用 Docker 吗?</title>
      <description>&lt;p&gt;如果开发期间使用 Docker，有没有最佳实践推荐？&lt;/p&gt;

&lt;p&gt;比如 homeland 项目从项目的 Docker 配置文件看，只做了 production 的版本。&lt;/p&gt;

&lt;p&gt;如果是在开发期间需要看各种调试信息及日志信息，是怎么做的？&lt;/p&gt;</description>
      <author>brookepowell</author>
      <pubDate>Wed, 07 Oct 2020 16:03:54 +0800</pubDate>
      <link>https://ruby-china.org/topics/40464</link>
      <guid>https://ruby-china.org/topics/40464</guid>
    </item>
    <item>
      <title>如何实现站点每个帐号只允许 1 个登录状态？</title>
      <description>&lt;p&gt;如题，目前使用 sorcery 这个 gem 实现的用户登录注册管理，session 存在 redis 中。&lt;/p&gt;

&lt;p&gt;请问实现思路大概是什么样子？&lt;/p&gt;</description>
      <author>brookepowell</author>
      <pubDate>Tue, 18 Aug 2020 20:58:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/40298</link>
      <guid>https://ruby-china.org/topics/40298</guid>
    </item>
    <item>
      <title>如何为当前 URL append 参数？</title>
      <description>&lt;p&gt;如果当前 URL 没有参数，我可以使用&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;link_to&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url_for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;new_param: &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但如果当前 URL 已有参数，如 &lt;code&gt;http://localhost:3000/posts?page=1&lt;/code&gt;，我如果还用上面的方法，&lt;code&gt;page&lt;/code&gt;参数就会被忽略。我尝试了 ruby-china 的切换语言链接，当主题列表中含&lt;code&gt;page&lt;/code&gt;参数时，也存在此问题。&lt;/p&gt;

&lt;p&gt;我尝试使用下面的方法来 merge 参数&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;link_to&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url_for&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;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;new_param: &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;会提示错误：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;unable to convert unpermitted parameters to hash&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;虽然下面的办法会有效，但会影响安全性：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;permit!&lt;/span&gt;
&lt;span class="n"&gt;link_to&lt;/span&gt; &lt;span class="s2"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url_for&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;merge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;new_param: &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;URL 中已存在的参数是不固定的，请问有没有完美的方法实现这个目的？&lt;/p&gt;</description>
      <author>brookepowell</author>
      <pubDate>Tue, 23 Jun 2020 18:29:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/39994</link>
      <guid>https://ruby-china.org/topics/39994</guid>
    </item>
    <item>
      <title>关于近期 Stack Overflow 发布的《2020 年开发者调查》中的美国平均工资最高的程序员排名</title>
      <description>&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2020/d0eb2190-f7f4-43d0-92ef-414f31fb28cd.png!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;原文： &lt;a href="https://insights.dice.com/2020/06/04/24-programming-languages-pay-top-salaries-scala/" rel="nofollow" target="_blank"&gt;https://insights.dice.com/2020/06/04/24-programming-languages-pay-top-salaries-scala/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;看到不少贴子觉得 ruby 过时的看法，这个排行大家怎么看？&lt;/p&gt;</description>
      <author>brookepowell</author>
      <pubDate>Fri, 12 Jun 2020 11:29:44 +0800</pubDate>
      <link>https://ruby-china.org/topics/39957</link>
      <guid>https://ruby-china.org/topics/39957</guid>
    </item>
    <item>
      <title>Google Cloud 的控制面板用的是什么 UI 框架?</title>
      <description>&lt;p&gt;看起来是 Material Design 的改良版，更适合做后台管理界面&lt;/p&gt;

&lt;p&gt;又足够简洁紧凑耐看，不知道有没有这样的开源版本？&lt;/p&gt;</description>
      <author>brookepowell</author>
      <pubDate>Mon, 25 May 2020 15:36:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/39900</link>
      <guid>https://ruby-china.org/topics/39900</guid>
    </item>
    <item>
      <title>使用 Graphql + Searchkick 的 N+1 问题</title>
      <description>&lt;p&gt;决定在项目中使用 Graphql 后，发现网上大多都是基于关系数据库做的项目，
可以参考的基于 elasticsearch 的项目不多&lt;a href="https://github.com/thebluedoc/bluedoc" rel="nofollow" target="_blank" title=""&gt;bluedoc&lt;/a&gt;算一个，但也只是仅用于搜索功能。&lt;/p&gt;

&lt;p&gt;我的项目获取数据是基于 searchkick，查询结果的 N+1 问题并不能使用基于&lt;code&gt;ActiveRecord::Associations&lt;/code&gt;的&lt;a href="https://github.com/Shopify/graphql-batch" rel="nofollow" target="_blank" title=""&gt;graphql-batch&lt;/a&gt;这样的 gem 解决。&lt;/p&gt;

&lt;p&gt;请问有没有同学有这方面经验做一下指点？&lt;/p&gt;</description>
      <author>brookepowell</author>
      <pubDate>Mon, 13 Apr 2020 15:20:54 +0800</pubDate>
      <link>https://ruby-china.org/topics/39737</link>
      <guid>https://ruby-china.org/topics/39737</guid>
    </item>
  </channel>
</rss>
