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)
答案 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]}")