Ich habe 2 Rails Modelle: Buch und Kategorie, wo ein Buch belongs_to
eine Kategorie, eine Kategorie has_many
Bücher.Fehlende Touch-Option in Rails has_many Beziehung
Der Kategoriename wird auf jeder Buchseite angezeigt, und Seiten werden zwischengespeichert.
Wenn ich einen Kategorienamen ändere (zB von "Sci Fi" zu "Science Fiction"), dann werden alle entsprechenden Buchseiten veraltet sein, und Bücher müssen "berührt" werden, um HTML-Regeneration auszulösen.
Es scheint Sinn machen zu können, tun:
class Category << ActiveRecord::Base
has_many :books, touch: true
end
Aber the option is unavailable, ich denke, da der touch
Mechanismus jedes Objekt instanziiert würde, die für has_many
Beziehungen in einer großen Leistungseinbußen führen könnte.
dass zu vermeiden, ich bin mit rohen SQL wie folgt:
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
die ziemlich schrecklich. Gibt es einen besseren Weg?
Sie sind in beiden Punkten richtig: 1) Ich muss alle Bücher ändern, wenn eine Kategorie ändert; 2) update_all ist einfacher und instanziiert die Modelle NICHT; Die direkt an die Datenbank gesendete SQL-Abfrage vermeidet Leistungsprobleme. – Giuseppe
aber wird dies ein Cache-Update auslösen? – user1262904