我听说过Rails' ActiveRecord / ActiveModel有一些名为" touch"。但是,我还没有找到任何描述此功能目的的内容。
它做了什么,有什么用?
答案 0 :(得分:36)
根据API Documentation,它是一种仅使用当前时间更新模型的指定时间戳的方法。所以为了更新updated_at
字段:
product.touch
或更新updated_at
和designed_at
字段:
product.touch(:designed_at)
现在,我以前从未使用过这种方法,但是我认为在某种情况下它会很有用“碰撞”#34;一个问题(比如Stack Overflow)到搜索查询的顶部而不实际更改内容。
答案 1 :(得分:19)
除了Ryan的答案之外,别忘了在模型中使用touch:
class Book < ActiveRecord::Base
belongs_to :library, touch: true
end
现在,当您向图书馆添加图书时,图书馆的updated_at
时间将反映最新图书的添加时间!奖金!
答案 2 :(得分:1)
如果您使用像flux(Alt / Redux)这样的前端框架或对服务器进行异步调用来更新模型,这将非常有用。在对服务器进行多次API调用的情况下,我使用它来首先检查模型的“updated_at”时序,然后再进行任何保存或验证。接下来,您可以使用“触摸”相应地更新“updated_at”字段。
答案 3 :(得分:0)
在rails touch中,用于更新持久对象的updated_at
字段。
但是,如果我们将其他属性作为参数传递,它将也与updated_at
一起更新这些字段。如果将其作为参数传递,它甚至会更新非日期时间字段。
例如
product.touch(:price) #price is an integer
将更新产品updated_at
,并将价格值设置为Time.now.to_i
答案 4 :(得分:0)
GET /_search
{
"script_fields": {
"diff": {
"script": {
"lang":"painless",
"source":"(doc['receivedOn'].value.getMillis()-doc['generetedOn'].value.getMillis() )==0"
}
}
}
}
可能会有用。
俄语玩偶缓存的优点是,如果更新单个产品,则在重新生成外部片段时可以重用所有其他内部片段。
如果[内部片段]的任何属性被更改,则
touch
值将被设置为当前时间,从而使高速缓存过期。但是,由于updated_at
不会更改[parent]对象,因此该缓存不会过期,并且您的应用将提供陈旧数据。为了解决这个问题,我们将模型与touch方法联系在一起。
答案 5 :(得分:0)
现在,在Rails 6中实现了一种称为 touch_all
的新方法。通过此操作,您可以更新收藏组的时间戳。
示例:如果您要使用所有产品的当前时间更新update_at的时间戳,则可以使用如下touch_all方法
Product.touch_all