目前遇到的情境為,某一頁在做查詢動作的時候需要回傳。直覺上來看,當我們在index頁面搜尋出結果之後,應該可以把搜尋到的結果存到某一個地方,再給export_result使用。
def index
return if !!params[:search] Do ransacking...
end# 匯出按鈕只有在有搜尋結果的情況才會出現
def export_result
Do ransacking... (The same ransacking action in index action)
end
原本的做法是,在2個controller裡面各做一次query,這時候心裡想著:如果能夠把index query的資料存起來就好了,便把腦筋動到session。
首先我把這些資料存進session用,讓index query出來的結果可以給export_result使用,但因為query出來的結果太多了,所以new-relic那邊顯示錯誤。在rails的session是用cookie實作,當資料筆數太多很快就會超過4kb就會爆掉,這個門檻在query多筆的情境很快就會滿出來。
後來想到controller有個特殊的方法叫action_name,那如果這樣寫的話或許有辦法,我們可以把getter, setter寫在query_products裡面
def index
return if !!params[:search]Do ransacking...
end# 匯出按鈕只有在有搜尋結果的情況才會出現
def export_result
Do ransacking... (The same ransacking action in index action)
enddef query_products
return `Do ransacking and save to @query_products` if action_name == index @query_products
end
但這方法顯然是沒有辦法成功,當執行到export_result之後,@query_products這個實體變數會重新變成nil,它不會幫我們在index就把@query_products存起來
上網查了這篇還蠻有參考價值,但不適用這裡的情境。解答者提供兩個方法,一個是使用session,另外一個是在redirect的時候把資料傳過去。前者的方法已經試過是不行的,後者目前沒有任何的情境遇到。除了Stackoverflow提到的兩個方法,還有個方法是在hidden layer存取對應的name, value,讓export_result的方法改為post利用表單的方式送出去,但因資料筆數過大(10萬筆),評估還是認為兩個action個別query一次的方法在這邊是最適合的。