ActiveRecord没有更新/保存,但显示该字段已在控制台中修改(db说不然)

时间:2011-11-03 19:23:18

标签: ruby-on-rails activerecord

content = Content.find(params[:content_id])
content.body.insert(start_index, span_open)
content.save!
content.body.insert(end_index + span_open.length, span_open)
content.save!

puts "=========================================="
c = Content.find(params[:content_id])
puts c.body

所以以上是我一直在努力做的事情。很多节省..它应该保存吗?

我在控制台中看到

===========================================
le modified text (body attr) here

我将span插入到文本中,并在控制台(上图)中显示puts语句中的更改成功。但是当我重新渲染页面时,一切都恢复原状(检查元素显示没有跨度)

我觉得奇怪的一件事是puts语句在

之前执行
"Processing NameOfController#action (for ....)" 

所有数据库调用等。我向下滚动到Content.find的位置(它有两次,所以这很容易)我看到了这个:

SHOW FIELDS FROM `contents`
  Content Load (1.6ms)   SELECT * FROM `contents` WHERE (`contents`.`id` = 328) 
  SQL (0.2ms)   BEGIN
  SQL (0.1ms)   COMMIT
  SQL (0.1ms)   BEGIN
  SQL (0.2ms)   COMMIT
  CACHE (0.0ms)   SELECT * FROM `contents` WHERE (`contents`.`id` = 328) 
  SQL (0.1ms)   BEGIN
  SQL (0.1ms)   COMMIT

现在,它说它正在从缓存中加载第二个调用......那是什么呢?自从我最后一次改变它以来.find()?

我正在使用Ruby on Rails 2.3.8

更新:纳入Dan Seaver的建议:

  content = Content.uncached_find(params[:content_id])
  content.body = content.body.insert(start_index, span_open)
  content.save!
  content.body = content.body.insert(end_index + span_open.length, span_close)
  content.save!
  a = content.body
# ActiveRecord::Base.connection.update("
#      UPDATE `contents`
#      SET body = '#{content.body}'
#      WHERE id = #{params[:content_id]}")
puts "=========================================="
content = Content.uncached_find(params[:content_id])
  puts (a == content.body).inspect

输出/终端:

==========================================
false

Content Load (1.5ms)   SELECT * FROM `contents` WHERE (`contents`.`id` = 351) 
  SQL (0.1ms)   BEGIN
  SQL (0.1ms)   COMMIT
  SQL (0.1ms)   BEGIN
  SQL (0.2ms)   COMMIT
  Content Load (0.3ms)   SELECT * FROM `contents` WHERE (`contents`.`id` = 351) 

2 个答案:

答案 0 :(得分:4)

Rails SQL Caching的工作方式是在一个操作中缓存查询:

  

但是,重要的是要注意查询缓存是在操作开始时创建的,并在该操作结束时销毁,因此仅在操作持续时间内持续存在。如果您想以更持久的方式存储查询结果,可以使用低级缓存在Rails中。

This article介绍了如何使用以下

来避免缓存

更新以前没有使用未缓存的内容,似乎是在活动记录中定义的,因此您必须将类方法添加到内容中,如下所示:

def self.uncached_find(content_id)
  uncached do 
    find(content_id)
  end 
end

然后使用Content.uncached_find(params[:content_id])documentation)您将使用Content.find

更新2 我现在看到了这个问题!!你实际上并没有修改任何东西。 String#insert 返回修改过的字符串,它不会修改content.body,您需要执行以下操作:

content.body = content.body.insert(start_index, span_open)

尝试保存上面的行,它应该可以正常工作

答案 1 :(得分:0)

强行更新:

ActiveRecord::Base.connection.update("
  UPDATE `contents`
  SET body = '#{content.body}'
  WHERE id = #{params[:content_id]}")