Ho 2 modelli di Rails: Libro e Categoria, dove un libro belongs_to
una categoria, una categoria has_many
libri.L'opzione di tocco mancante in Rails ha_molto rapporto
Il nome della categoria viene visualizzato nella pagina di ogni libro e le pagine sono memorizzate nella cache.
Se cambio il nome di una categoria (ad esempio, da "Sci Fi" a "Fantascienza"), tutte le pagine del libro corrispondenti saranno obsolete ei libri devono essere "toccati" per attivare la rigenerazione HTML.
Sembrerebbe di dare un senso di essere in grado di fare:
class Category << ActiveRecord::Base
has_many :books, touch: true
end
Ma the option is unavailable, credo perché il meccanismo touch
sarebbe un'istanza di ogni oggetto, che potrebbe tradursi in un importante calo di prestazioni per has_many
relazioni.
Per evitare questo, sto usando SQL prime come segue:
class Category << ActiveRecord::Base
has_many :books
after_update -> {
ActiveRecord::Base.connection.execute "UPDATE books SET updated_at='#{current_time_string}' WHERE category_id=#{id})"
}
end
che è abbastanza terribile. C'è un modo migliore?
Hai ragione su entrambi i fronti: 1) Devo cambiare tutti i libri quando una categoria cambia; 2) update_all è più semplice e NON istanzia i modelli; la query SQL inviata direttamente al DB evita problemi di prestazioni. – Giuseppe
ma questo farà scattare un aggiornamento della cache? – user1262904