2009-11-11 8 views
2

Est-il possible de le faire dans Rails: J'ai une requête activerecordRails optmization (avec des aides de activerecord et vue)

@posts = Post.find_by_id(10) 

Anytime la requête est appelée, SQL est généré et exécuté à la DB ressemble à ce

SELECT * FROM 'posts' WHERE id = 10 

cela se produit chaque fois que la requête AR est exécutée. De même avec une méthode d'assistance comme celui-ci

<%= f.textarea :name => 'foo' %> 
#=> <input type='textarea' name='foo' /> 

J'écris un code Railsy qui génère un texte qui est utilisé par un autre système (base de données, navigateur Web). Je me demande s'il existe un moyen d'écrire une requête AR ou un appel de méthode d'assistance qui génère le texte dans le fichier. De cette façon, le rendu du texte est fait une seule fois (chaque fois que le code change) au lieu de chaque fois que la méthode est appelée?

+0

Vous semblez vouloir générer du code HTML statique à partir de votre programme de rails? –

+0

pour les aides oui. pour AR, id aiment générer 'static sql' – user94154

Répondre

0

Comme Radar a suggéré que vous devriez probablement regarder dans la mise en cache Rails. Vous pouvez commencer avec quelque chose de simple comme le magasin de mémoire ou le cache de fichiers, puis passer à quelque chose de mieux comme memcached si nécessaire. Vous pouvez lancer une mise en cache dans la méthode d'assistance qui mettra en cache le résultat après qu'il a été interrogé une fois. Ainsi, par exemple, vous pouvez faire:

id = 10 # id is probably coming in as a param/argument 
    cache_key = "Post/#{id}" 
    @post = Rails.cache.read(cache_key) 
    if @post.nil? 
     @post = Post.find_by_id(id) 
     # Write back to the cache for the next time 
     Rails.cache.write(cache_key,@post) 
    end 

La seule autre chose à faire est de mettre dans un code à expiration l'entrée du cache si les changements de poste. Pour cela, jetez un oeil à l'utilisation de "Sweepers" dans Rails. Alternativement, vous pouvez regarder quelques-unes des gemmes de mise en cache comme Cache-fu et Cached-model.

0

Je ne suis pas sûr de bien comprendre votre question.

Si vous posez des questions sur la requête générée, vous pouvez simplement faire find_by_sql et écrire votre propre SQL si vous ne voulez pas utiliser les méthodes dynamiques d'enregistrement actif.

Si vous demandez à propos de la mise en cache du résulset à un fichier, il est déjà dans la base de données, je ne sais pas si elle était dans un fichier, il serait beaucoup plus efficace.

+0

même pas en cache le resultset, juste en cache la requête générée. Je connais find_by_sql. Mon problème est que je ne veux pas écrire raw sql, j'aime activerecord. Mais il semble que ce soit un gaspillage de générer la même chaîne des milliers de fois. – user94154

+0

Je pense que peu importe le gaspillage, ce ne serait jamais un problème. Ceci est généré par le code. Le goulot d'étranglement sera probablement ** toujours ** la base de données. – JRL

1

Regardez la ligne, il peut aller à la base de données pour le premier mais ceux après qu'il pourrait être dit CACHE au début de la ligne ce qui signifie qu'il va dans le cache de requête d'ActiveRecord.

Il me semble aussi que vous voulez mettre en cache la page, pas la requête. Et même si c'était la requête, je ne pense pas que ce soit aussi simple que find_by_id(10) :)