2012-04-14 5 views
3

Ich verwende Ruby on Rails v3.2.2 und möchte Datenbankdaten abrufen, indem ich den Systemcache nur in einem Fall deaktiviere. Das ist aus meiner Sicht Datei Ich habe so etwas wie die folgenden:Wie kann Datenbankdaten abgerufen werden, indem das Ruby on Rails-Cachesystem nur für einen Fall deaktiviert wird?

<h1>Random articles 1</h1> 
<%= Article.order('RAND()').limit(3).inspect %> 
... 
<h1>Random articles 2</h1> 
<%= Article.order('RAND()').limit(3).inspect %> 

Wenn die View-Datei gerendert wird er die gleichen Daten für beide Ausgänge unter „Random Artikel 1“ und „Random Artikel 2“. Dies geschieht, weil das Ruby-on-Rails-Cache-System (nach "default"/"convention") aus Leistungsgründen versucht, die Datenbank so wenig wie möglich zu treffen.

Wie kann ich dieses Verhalten verhindern (nur für den oben genannten Fall), um andere Daten für Finder-Methoden in meiner Ansichtsdatei auszugeben?

Antwort

6

Es gibt uncached Methode in ActiveRecord. Sieht aus, als könntest du es so benutzen:

aber du extrahierst das besser in die Klassenmethode deines Modells.

Siehe this article für weitere Informationen

0

Ich habe versucht, das Problem zu reproduzieren, konnte aber nicht (Rails 3.2.2 auch mit sqlite3-Adapter, Code unten). Aber versuchen Sie diese trotzdem:

Article.uncached do Article.order('RAND()').limit(3).inspect end 

Das Folgende ist, wie ich versuchte, das Problem in einem leeren Rails-Projekt zu reproduzieren, für mich ergab den Artikel in einer anderen Reihenfolge des ganze Zeit, aber:

ActiveRecord::Migration.create_table :articles do |t| t.string :name end 
class Article < ActiveRecord::Base; end 
20.times do |i| Article.create :name => "Article#{i}" end 
# sqlite doesn't have a RAND() function, emulate it 
Article.connection.instance_variable_get(:@connection).define_function 'RAND' do rand end 
p *Article.order('RAND()').limit(3) 

Vielleicht haben Sie einen Fehler bei der Reproduktion Ihres Problems festgestellt.

+0

Meep, ich ging einfach zu sqlite's docs, und natürlich hat es eine Rand-Funktion, es heißt nur RANDOM(), nicht RAND() - meine schlechte :) (so viel für SQL & Standards: -S) – apeiros

Verwandte Themen