Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么while循环是+;睡眠+;Rails中的ActiveRecord.find在应该返回记录时不返回记录?_Ruby On Rails_Comet - Fatal编程技术网

Ruby on rails 为什么while循环是+;睡眠+;Rails中的ActiveRecord.find在应该返回记录时不返回记录?

Ruby on rails 为什么while循环是+;睡眠+;Rails中的ActiveRecord.find在应该返回记录时不返回记录?,ruby-on-rails,comet,Ruby On Rails,Comet,我正在尝试在Rails应用程序中实现comet方法。我有以下资料: def poll records = [] start_time = Time.now.to_i while records.length == 0 do records = Something.find(:all, :conditions => { :some_condition => false}) if records.length > 0 br

我正在尝试在Rails应用程序中实现comet方法。我有以下资料:

def poll
  records = []
  start_time = Time.now.to_i

  while records.length == 0 do
    records = Something.find(:all,
        :conditions => { :some_condition => false})

    if records.length > 0
      break
    end

    sleep 1

    if Time.now.to_i - start_time >= 10
      break
    end
  end

  responseData = []

  records.each do |record|
    responseData << {
      'something' => record.some_value
    }

    # Flag message as received.
    record.some_condition = true
    record.save
  end

  render :text => responseData.to_json
end
def轮询
记录=[]
开始时间=time.now.to\i
而records.length==0则
记录=某物。查找(:全部,
:conditions=>{:some_condition=>false})
如果记录长度>0
打破
结束
睡眠1
如果Time.now.to_i-开始时间>=10
打破
结束
结束
响应数据=[]
记录。每个人都做记录|
响应数据记录。某些值
}
#将消息标记为已接收。
record.some_condition=true
记录。保存
结束
render:text=>responseData.to_json
结束
现在,当我手动转到URL时,它会在那里等待10秒钟,并按预期超时。如果修改数据库,使Something.find()返回记录,然后再次转到URL,则调用会立即返回

但是,如果我转到URL,然后在数据库上快速运行更新,使Something.find()能够找到记录,它就会一直放在那里,直到10秒后超时。我希望在我进行更改并返回后,它会立即看到对数据库的更改


你知道为什么吗?我也愿意接受改进建议。

这是因为默认情况下会缓存查询。试试这个:

records = Something.uncached{Something.find(:all,
            :conditions => { :some_condition => false})}

引用:

这是因为您的查询在默认情况下是缓存的。试试这个:

records = Something.uncached{Something.find(:all,
            :conditions => { :some_condition => false})}
参考: