在Rails' ActiveRecord,触摸是什么?

时间:2015-07-28 01:16:27

标签: ruby-on-rails rails-activerecord

我听说过Rails' ActiveRecord / ActiveModel有一些名为" touch"。但是,我还没有找到任何描述此功能目的的内容。

它做了什么,有什么用?

6 个答案:

答案 0 :(得分:36)

根据API Documentation,它是一种仅使用当前时间更新模型的指定时间戳的方法。所以为了更新updated_at字段:

product.touch

或更新updated_atdesigned_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)

如果您正在做Russian Doll caching

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