我有一个Rails应用程序,其中有一个在表上创建元素的请求,另一个正在等待,它读取是否创建了该元素。
现在,我检查了实时数据,并且等待过程从未看到该表的任何新记录。
有什么主意如何强制重新连接或会更新模型参考的任何内容?
基本思想:
我将不胜感激。
答案 0 :(得分:1)
等待的请求可能正在使用ActiveRecord缓存。 Rails在请求持续时间内缓存查询,因此,如果您在同一请求中多次运行完全相同的查询,则只会在第一次访问数据库。
您可以在控制台中对此进行仿真:
Entity.cache { Entity.first; Entity.first }
在日志中,您会看到类似以下内容(请注意,第二个请求是CACHE
):
[2018-12-06T10:51:02.436 DEBUG (1476) #] Entity Load (4.9ms) SELECT "entities".* FROM "entities" LIMIT 1
[2018-12-06T10:51:02.450 DEBUG (1476) #] CACHE (0.0ms) SELECT "entities".* FROM "entities" LIMIT 1
要绕过缓存,可以使用:
Entity.uncached { Entity.where(key: @key)&.last }
即使封闭范围在uncached
块内运行,使用cached
也会禁用块内的缓存。
答案 1 :(得分:0)
对于一个正在运行的Rails应用程序来说,如果正在运行的一段代码正在寻找由新请求更新的任何内容,则在第一次执行该代码之后,将不会使用active_record模型显示更新的数据。
解决方案:只需运行原始查询即可。
sql = "SELECT * FROM entities WHERE key = '"+key+"' ORDER BY ID DESC LIMIT 1;"
records_array = ActiveRecord::Base.connection.execute(sql).values
我知道这是一个极大的过分简化,可能存在一个潜在的问题,但是确实解决了。