2012-12-06 88 views
0

我正在向我的控制器操作之一發出一個AJAX get請求,這個動作可以用於爲JSON提供一個javascript函數,該函數又會根據我的視圖中的數據生成一個svg。Rails傳遞ActiveRecord ::關係內部參數?

但是,我正在使用的數據還需要在視圖內部的表格中表示,我不希望查詢必須不止一次針對數據庫運行,所以我想知道它是否是可能只是在頁面的初始請求上執行查詢,然後在params散列下使用AJAX將它傳遞給我的其他控制器?

爲了簡化問題繼承人的當前工作流程的概述:

網頁請求 - >查詢 - >查看曾任 - > AJAX GET請求 - >查詢 - >生成SVG

什麼我想:

網頁請求 - >查詢 - >查看曾任 - > AJAX GET請求 - >生成SVG

我想我可以簡單地傳遞關係作爲AJAX請求設置了一個param但不是通過關係作爲一個ActiveRecord ::關係它傳遞的是一個字符串:

"#<ActiveRecord::Relation:0x00000009137fc8>":String 

我也試圖將其存儲到一個會話,例如:

session[:foo] = @bar 

但我遇到以下錯誤消息,這導致我相信會話不能存儲關係?

不能轉儲默認PROC

什麼是這種工作流的首選解決方案哈希?

回答

1

ActiveRecord::Relation是一個內部的Rails對象,它不是JavaScript的「外部世界」所知道的任何東西。 (理論上,你可以序列化,然後反序列化它......但這只是一個壞主意:-)。所以不,這不是正確的方法。您可以在會話中保存對象本身(查詢的結果,而不是ActiveRecord :: Relation),但這通常不是好的做法。

那麼你怎麼能夠完成你想要的?首先,Rails傾向於緩存大多數數據庫查詢,因此在優化某些內容之前,請確保它需要優化。

假設它確實如此,您似乎在做兩件獨立的事情:顯示查詢結果,然後發出生成SVG的不同請求(AJAX請求)。這兩種完全不同的方法不是完全不同的(很明顯,這在某些方面是相關的),但形式不同,並且在不同的時間運行。這會提出兩種不同的方法。

如果它們非常接近 - 也就是說,在第一個視圖中你有90%的需要,那麼你也可以在第一個視圖中添加一個隱藏字段或未顯示的值,並在JS中觸發您的AJAX會查詢頁面(DOM)以獲取生成SVG所需的值。

在某些情況下,我看到人們在HTML中使用data-屬性來以更容易通過JS訪問的更加結構化的形式保存屬性值,從而有效地將完整對象序列化爲HTML中未顯示的數據。

但在這之前,請確保您正在優化的東西,需要優化:-)

0

,你可以這樣做:

VAR關係='<%= @ criteria.where_values_hash.to_json。 html_safe%>'

然後,您可以在「數據」中的ajax請求中發送此關係var