2015-07-28 15 views
11

Ho sentito parlare di ActiveRecord/ActiveModel di Rails che ha qualcosa chiamato "touch". Tuttavia, non ho trovato nulla che descriva lo scopo di questa funzionalità.In ActiveRecord di Rails, a cosa serve?

Che cosa fa e a cosa serve?

+0

Utilizzato solo per "modificare" un modello in modo da sapere quando è stato utilizzato l'ultima volta in un contesto pertinente. Per esempio. aggiornare un utente al login in modo da sapere quando sono stati fermati. – tyler

risposta

21

Come da API Documentation, è un metodo che aggiorna solo i timestamp specificati del modello con l'ora corrente. Quindi, al fine di aggiornare il campo updated_at:

product.touch 

o per aggiornare le updated_at e designed_at campi:

product.touch(:designed_at) 

Ora, non ho mai usato questo metodo prima, ma mi piacerebbe pensare che sarebbe stato utile in una situazione per "eseguire il bump" di una domanda (come su Stack Overflow) all'inizio di una query di ricerca senza effettivamente cambiarne il contenuto.

+4

Credo che abbiano preso il nome dall'utilità della riga di comando ['touch (1)'] (http://man7.org/linux/man-pages/man1/touch.1.html), che aggiorna un file modificato a campo dei metadati. –

+1

Si noti che, secondo la documentazione di cui sopra, mentre touch modifica la riga del database dell'oggetto su cui è utilizzato, non fa scattare più dei normali callback di Rails. Gli unici callback attivati ​​sono 'after_touch',' after_commit' e 'after_rollback'. 'before_validation',' after_save', ecc. non vengono eseguiti dopo aver toccato un modello, quindi assicurati di non aver bisogno di alcuna logica in essi se stai usando touch. – whognu

10

aggiunta alla risposta di Ryan, non dimenticare di usare tatto nei modelli in questo modo:

class Book < ActiveRecord::Base 
    belongs_to :library, touch: true 
end 

Ora, quando si aggiunge un libro alla biblioteca, il tempo della biblioteca updated_at rifletterà il momento l'ultimo libro è stato aggiunto! Bonus!

0

È utile se si utilizza un framework di front-end come il flusso (Alt/Redux) o le chiamate asincrone al server, per aggiornare il modello. Nel caso di più chiamate API effettuate al tuo server, l'ho usato per controllare prima la tempistica 'updated_at' di un modello prima di eseguire qualsiasi salvataggio o convalida. Successivamente, puoi usare 'touch' per aggiornare il campo 'updated_at' di conseguenza.