2009-11-11 112 views
2

有沒有辦法在Rails中做到這一點: 我有一個ActiveRecord查詢Rails的optmization(用ActiveRecord和視圖助手)

@posts = Post.find_by_id(10) 

隨時查詢被調用,生成並在數據庫中執行的SQL看起來是這樣的

SELECT * FROM 'posts' WHERE id = 10 

這發生在執行AR查詢時間。類似地,像這樣

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

一個輔助方法予寫,其產生用於通過一些其它系統(數據庫,網絡瀏覽器)一些文本一些Railsy代碼。我想知道是否有辦法編寫一個AR查詢或輔助方法調用,在文件中生成文本。這樣,文本渲染只會執行一次(每次代碼更改),而不是每次調用方法時都執行?

+0

聽起來像是你想從你的Rails程序生成靜態html? – 2009-11-11 20:06:55

+0

爲幫手是的。對於AR,id喜歡生成'static sql' – user94154 2009-11-11 20:12:54

回答

0

像雷達建議你應該看看Rails的緩存。你可以從像內存存儲或文件緩存這樣簡單的東西開始,然後根據需要移動到更類似memcached的東西。您可以將一些緩存引入輔助方法,該方法會在查詢一次後緩存結果。因此,例如,你可以這樣做:

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 

唯一的其他東西剩下要做的就是把一些代碼到期後話了變化的緩存條目。爲了看看在Rails中使用「Sweepers」。或者,您可以查看一些緩存寶石,如Cache-fu和Cached-model。

0

我不知道我完全理解你的問題。

如果您詢問生成的查詢,則可以執行find_by_sql並編寫自己的SQL(如果您不想使用活動記錄動態方法)。

如果你問緩存resulset到一個文件中,它已經在數據庫中,我不知道,如果它是在一個文件時,它會更有效。

+0

甚至不緩存結果集,只是緩存生成的查詢。 我知道find_by_sql。我的問題是,我不想寫生的SQL,我喜歡activerecord。但是,似乎浪費數千次來生成相同的字符串。 – user94154 2009-11-11 20:11:11

+0

我會認爲,無論浪費,它永遠不會是一個問題。這是由代碼生成的。瓶頸將最有可能**總是**數據庫。 – JRL 2009-11-11 20:18:50

1

看行,可以將數據庫中的第一個,但那些後它可以在該行意味着它要的ActiveRecord的查詢緩存開始時說緩存。

像你希望緩存的頁面,而不是查詢它聽起來也給我。而且,即使它是查詢,我不認爲它是那樣簡單find_by_id(10) :)