<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>raja</title>
    <link>https://ruby-china.org/raja</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Rails SQL 查询语句不会立即执行？</title>
      <description>&lt;p&gt;遇到一个奇怪的问题，我有一个&lt;code&gt;task model&lt;/code&gt; 和&lt;code&gt;video model&lt;/code&gt;，一对多的关系，现在是想在软删除&lt;code&gt;task&lt;/code&gt;的时候，获取它所有的&lt;code&gt;video&lt;/code&gt;，但是由于会将相应的&lt;code&gt;video&lt;/code&gt;的&lt;code&gt;task_id&lt;/code&gt;置为空，导致获取到的视频结果也是空的。&lt;/p&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="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;destroy_tasks&lt;/span&gt; &lt;span class="n"&gt;ids&lt;/span&gt;
  &lt;span class="n"&gt;not_delete_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ids&lt;/span&gt;
  &lt;span class="n"&gt;correct_ids&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ids&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;not_delete_ids&lt;/span&gt;
  &lt;span class="n"&gt;correct_ids&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort!&lt;/span&gt;
  &lt;span class="n"&gt;videos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:task_id&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;correct_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;correct_ids&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pluck&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="n"&gt;destroy_params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
  &lt;span class="n"&gt;names&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="nb"&gt;name&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;
    &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="si"&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;to_i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:delete_at&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
    &lt;span class="n"&gt;destroy_params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="no"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;correct_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;destroy_params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="no"&gt;Video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:task_id&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;correct_ids&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;update_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:task_id&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;respond_to&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;html&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;redirect_to&lt;/span&gt; &lt;span class="n"&gt;tasks_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;notice: &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;I18n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'notice.destroy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;model: &lt;/span&gt;&lt;span class="no"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;human&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="ss"&gt;:destroy_tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;locals: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;ids: &lt;/span&gt;&lt;span class="n"&gt;correct_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;action: &lt;/span&gt;&lt;span class="s1"&gt;'destroy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;videos: &lt;/span&gt;&lt;span class="n"&gt;videos&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;strong&gt;看日志发现，获取&lt;code&gt;video&lt;/code&gt;的 sql 语句是在最后执行的，尽管它在程序中的语句十分靠前&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Started POST &lt;span class="s2"&gt;"/tasks/handle"&lt;/span&gt; &lt;span class="k"&gt;for &lt;/span&gt;127.0.0.1 at 2015-12-09 15:53:18 +0800
Processing by TasksController#handle_tasks as JSON
  Parameters: &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"utf8"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"✓"&lt;/span&gt;, &lt;span class="s2"&gt;"tasks"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"113,"&lt;/span&gt;, &lt;span class="s2"&gt;"next_action"&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;"destroy"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
  User Load &lt;span class="o"&gt;(&lt;/span&gt;0.5ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT  &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;users&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;users&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt; WHERE &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;users&lt;/span&gt;&lt;span class="sb"&gt;`&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;`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 1  ORDER BY &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;users&lt;/span&gt;&lt;span class="sb"&gt;`&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;`&lt;/span&gt; ASC LIMIT 1
   &lt;span class="o"&gt;(&lt;/span&gt;0.5ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="sb"&gt;`&lt;/span&gt;tasks&lt;span class="sb"&gt;`&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;`&lt;/span&gt; FROM &lt;span class="sb"&gt;`&lt;/span&gt;tasks&lt;span class="sb"&gt;`&lt;/span&gt; WHERE &lt;span class="o"&gt;(&lt;/span&gt;delete_at IS NULL&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="o"&gt;(&lt;/span&gt;0.4ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="sb"&gt;`&lt;/span&gt;tasks&lt;span class="sb"&gt;`&lt;/span&gt;.&lt;span class="sb"&gt;`&lt;/span&gt;name&lt;span class="sb"&gt;`&lt;/span&gt; FROM &lt;span class="sb"&gt;`&lt;/span&gt;tasks&lt;span class="sb"&gt;`&lt;/span&gt; WHERE &lt;span class="o"&gt;(&lt;/span&gt;delete_at IS NULL&lt;span class="o"&gt;)&lt;/span&gt; AND &lt;span class="sb"&gt;`&lt;/span&gt;tasks&lt;span class="sb"&gt;`&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;`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 113
  Task Load &lt;span class="o"&gt;(&lt;/span&gt;0.5ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT  &lt;span class="sb"&gt;`&lt;/span&gt;tasks&lt;span class="sb"&gt;`&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="sb"&gt;`&lt;/span&gt;tasks&lt;span class="sb"&gt;`&lt;/span&gt; WHERE &lt;span class="o"&gt;(&lt;/span&gt;delete_at IS NULL&lt;span class="o"&gt;)&lt;/span&gt; AND &lt;span class="sb"&gt;`&lt;/span&gt;tasks&lt;span class="sb"&gt;`&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;`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 113 LIMIT 1
   &lt;span class="o"&gt;(&lt;/span&gt;0.6ms&lt;span class="o"&gt;)&lt;/span&gt;  BEGIN
  Task Exists &lt;span class="o"&gt;(&lt;/span&gt;0.6ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT  1 AS one FROM &lt;span class="sb"&gt;`&lt;/span&gt;tasks&lt;span class="sb"&gt;`&lt;/span&gt; WHERE &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;tasks&lt;span class="sb"&gt;`&lt;/span&gt;.&lt;span class="sb"&gt;`&lt;/span&gt;name&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; BINARY &lt;span class="s1"&gt;'测试任务51-1449647598'&lt;/span&gt; AND &lt;span class="sb"&gt;`&lt;/span&gt;tasks&lt;span class="sb"&gt;`&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;`&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; 113&lt;span class="o"&gt;)&lt;/span&gt; LIMIT 1
  SQL &lt;span class="o"&gt;(&lt;/span&gt;0.5ms&lt;span class="o"&gt;)&lt;/span&gt;  UPDATE &lt;span class="sb"&gt;`&lt;/span&gt;tasks&lt;span class="sb"&gt;`&lt;/span&gt; SET &lt;span class="sb"&gt;`&lt;/span&gt;name&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'测试任务51-1449647598'&lt;/span&gt;, &lt;span class="sb"&gt;`&lt;/span&gt;delete_at&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'2015-12-09 15:53:18'&lt;/span&gt;, &lt;span class="sb"&gt;`&lt;/span&gt;updated_at&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'2015-12-09 15:53:18'&lt;/span&gt; WHERE &lt;span class="sb"&gt;`&lt;/span&gt;tasks&lt;span class="sb"&gt;`&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;`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 113
   &lt;span class="o"&gt;(&lt;/span&gt;65.7ms&lt;span class="o"&gt;)&lt;/span&gt;  COMMIT
  SQL &lt;span class="o"&gt;(&lt;/span&gt;47.4ms&lt;span class="o"&gt;)&lt;/span&gt;  UPDATE &lt;span class="sb"&gt;`&lt;/span&gt;videos&lt;span class="sb"&gt;`&lt;/span&gt; SET &lt;span class="sb"&gt;`&lt;/span&gt;videos&lt;span class="sb"&gt;`&lt;/span&gt;.&lt;span class="sb"&gt;`&lt;/span&gt;task_id&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; NULL WHERE &lt;span class="o"&gt;(&lt;/span&gt;delete_at IS NULL&lt;span class="o"&gt;)&lt;/span&gt; AND &lt;span class="sb"&gt;`&lt;/span&gt;videos&lt;span class="sb"&gt;`&lt;/span&gt;.&lt;span class="sb"&gt;`&lt;/span&gt;task_id&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 113
  Video Load &lt;span class="o"&gt;(&lt;/span&gt;0.5ms&lt;span class="o"&gt;)&lt;/span&gt;  SELECT &lt;span class="sb"&gt;`&lt;/span&gt;videos&lt;span class="sb"&gt;`&lt;/span&gt;.&lt;span class="k"&gt;*&lt;/span&gt; FROM &lt;span class="sb"&gt;`&lt;/span&gt;videos&lt;span class="sb"&gt;`&lt;/span&gt; WHERE &lt;span class="o"&gt;(&lt;/span&gt;delete_at IS NULL&lt;span class="o"&gt;)&lt;/span&gt; AND &lt;span class="sb"&gt;`&lt;/span&gt;videos&lt;span class="sb"&gt;`&lt;/span&gt;.&lt;span class="sb"&gt;`&lt;/span&gt;task_id&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 113
  Rendered tasks/destroy_tasks.json.jbuilder &lt;span class="o"&gt;(&lt;/span&gt;1.8ms&lt;span class="o"&gt;)&lt;/span&gt;
Completed 200 OK &lt;span class="k"&gt;in &lt;/span&gt;140ms &lt;span class="o"&gt;(&lt;/span&gt;Views: 4.4ms | ActiveRecord: 117.2ms&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;把&lt;code&gt;Video.where(:task_id =&amp;gt; correct_ids).update_all(:task_id =&amp;gt; nil)&lt;/code&gt;语句放在函数最下面就没问题。&lt;/p&gt;

&lt;p&gt;似乎是因为 ruby 变量只有在第一次使用的时候才会确定它的值？依稀有这个概念，但是不太确定。&lt;/p&gt;

&lt;p&gt;在 rails console 下面写了一个 test 函数测试，能获取正确的 videos，然而在删除第一个&lt;code&gt;p videos&lt;/code&gt;后，只会得到空结果。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;
  &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;
  &lt;span class="n"&gt;videos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;videos&lt;/span&gt;
  &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;videos&lt;/span&gt;
  &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;
  &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:delete_at&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&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="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="si"&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;to_i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="no"&gt;Video&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:task_id&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;update_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:task_id&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;videos&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="补充"&gt;补充&lt;/h4&gt;
&lt;p&gt;google 到&lt;a href="http://rubyinrails.com/2014/01/08/what-is-lazy-loading-in-rails/" rel="nofollow" target="_blank" title=""&gt;一篇文章&lt;/a&gt;提到了这个，还有&lt;a href="http://www.theodinproject.com/ruby-on-rails/active-record-queries" rel="nofollow" target="_blank" title=""&gt;这篇&lt;/a&gt;&lt;/p&gt;</description>
      <author>raja</author>
      <pubDate>Wed, 09 Dec 2015 17:30:55 +0800</pubDate>
      <link>https://ruby-china.org/topics/28327</link>
      <guid>https://ruby-china.org/topics/28327</guid>
    </item>
    <item>
      <title>Rails 项目部分视频在 Chrome 下不能播放</title>
      <description>&lt;h4 id="最近有个rails项目需要播放视频, 但是在chrome下有些较大的视频(&gt;5M) 不能播放"&gt;最近有个 rails 项目需要播放视频，但是在 chrome 下有些较大的视频 (&amp;gt;5M) 不能播放&lt;/h4&gt;
&lt;p&gt;在 firefox 下却可以。本以为是浏览器问题，但是直接用 &lt;code&gt;html&lt;/code&gt;就能正常播放。使用 &lt;code&gt;php&lt;/code&gt; 在 chrome 下也能正常播放.
所有视频编码都是 &lt;strong&gt;H.264&lt;/strong&gt; ;  chrome 下部分视频能播放，路径应该也是正确的&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; 使用的是 video.js&lt;/li&gt;
&lt;li&gt; 服务器 thin &lt;/li&gt;
&lt;li&gt; 视频文件放在  &lt;code&gt;/public/upload/video/url/&lt;/code&gt; 下面&lt;/li&gt;
&lt;li&gt; ruby 2.2, rails 4.2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;代码都很简单&lt;/p&gt;
&lt;h5 id="ruby代码:"&gt;ruby 代码：&lt;/h5&gt;&lt;pre class="highlight erb"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;videojs_rails&lt;/span&gt; &lt;span class="ss"&gt;sources: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;mp4: &lt;/span&gt;&lt;span class="vi"&gt;@video.url&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="ss"&gt;:"400"&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
    Please enable &lt;span class="nt"&gt;&amp;lt;b&amp;gt;&lt;/span&gt;JavaScript&lt;span class="nt"&gt;&amp;lt;/b&amp;gt;&lt;/span&gt; to see this content.
&lt;span class="cp"&gt;&amp;lt;%-&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id="html 代码:"&gt;html 代码：&lt;/h5&gt;&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;video&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./1-5.mp4"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;preload=&lt;/span&gt;&lt;span class="s"&gt;"none"&lt;/span&gt; &lt;span class="na"&gt;autoplay=&lt;/span&gt;&lt;span class="s"&gt;"autoplay"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/video&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id="chrome日志文件:"&gt;chrome 日志文件：&lt;/h5&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;1:1:1030/152457:ERROR:render_media_log.cc&lt;span class="o"&gt;(&lt;/span&gt;20&lt;span class="o"&gt;)]&lt;/span&gt; MediaEvent: PIPELINE_ERROR demuxer: could not open
&lt;span class="o"&gt;[&lt;/span&gt;1:1:1030/152646:ERROR:render_media_log.cc&lt;span class="o"&gt;(&lt;/span&gt;20&lt;span class="o"&gt;)]&lt;/span&gt; MediaEvent: PIPELINE_ERROR demuxer: could not open
&lt;span class="o"&gt;[&lt;/span&gt;1:1:1030/152658:ERROR:render_media_log.cc&lt;span class="o"&gt;(&lt;/span&gt;20&lt;span class="o"&gt;)]&lt;/span&gt; MediaEvent: PIPELINE_ERROR demuxer: no supported streams
&lt;span class="o"&gt;[&lt;/span&gt;1:1:1030/152708:ERROR:render_media_log.cc&lt;span class="o"&gt;(&lt;/span&gt;20&lt;span class="o"&gt;)]&lt;/span&gt; MediaEvent: PIPELINE_ERROR demuxer: could not parse
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;del&gt;搜索错误相关代码时&lt;/del&gt;, 但是没有找到...&lt;/p&gt;

&lt;p&gt;期间新建过一个干净的 rails 项目，仍然存在同样的问题
最初使用 &lt;strong&gt;webrick&lt;/strong&gt; 时，&lt;em&gt;firefox&lt;/em&gt; 下面较大的视频 ( &lt;strong&gt;10M&lt;/strong&gt; ) 也不能播放，而且是浏览器直接 crash, 换成 &lt;strong&gt;thin&lt;/strong&gt; 后就正常
所以有些怀疑是不是服务器对文件大小有限制的原因，但是在 firefox 下却完全正常，实在找不出原因，求解答&lt;/p&gt;

&lt;p&gt;谢谢！&lt;/p&gt;</description>
      <author>raja</author>
      <pubDate>Fri, 30 Oct 2015 16:51:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/27899</link>
      <guid>https://ruby-china.org/topics/27899</guid>
    </item>
  </channel>
</rss>
