2012-01-10 49 views
1

我是Ruby on Rails的新手,我在刷新/重新載入關係時遇到問題。在下面的代碼片段中,我試圖在'customer'對象上設置'store'屬性,然後讓customer對象返回嵌套store屬性,而不是它的id。有沒有一種方法可以設置商店屬性,然後告訴RoR「讓我到客戶並保存商店」而不做另一種急切的讀取負載?Ruby刷新對象

store_id = params[:id]; 
store = Store.find(store_id); 
session[ :store_id ] = store_id; 

customer_id = session[ :customer_id ]; 
customer = Customer.find(customer_id); 
customer.store = store; 
customer.save 

respond_to do |format| 
    format.any(:json) { render :json => customer.to_json } 
end 

任何幫助或任何建議,不管它們是否與原始問題有關,是非常感謝。

+2

所以你說'customer.store'只返回商店ID?它應該返回一個'Store'類對象。或者你問如何消除使用'customer.store'的額外數據庫調用? – iwasrobbed 2012-01-10 05:46:23

回答

3

to_json使用參數就可以了你:

在您的例子中,你只需要更改最後一節(和存儲對象將不會從數據庫中第二次被加載)

respond_to do |format| 
    format.any(:json) { render :json => customer.to_json(:methods => :store) } 
end 
+0

過來聊聊!我有一些有趣的東西給你! http://chat.stackoverflow.com/rooms/5676/ruby-on-rails-enterprise-application-developers – 2012-01-10 09:11:17

+0

@阿萊尼謝謝阿隆尼,這讓它工作。哦,你是阿勒尼家嗎?對不起,我也是。 – 2012-01-10 16:28:14

+0

:))不錯,我可以幫你,而阿隆尼是我的名字;) – alony 2012-01-10 19:07:55

1

在軌道上3.1,您可以通過

customer.association(:store) 

直接訪問的關聯對象在軌的關聯對象沒有被直接暴露這樣的早期版本。然後,您可以做的東西一樣

customer.association(:store).loaded? 
customer.association(:store).target = store 

這不會檢查客戶和商店相關聯(即你可以堅持任何舊店有),所以要小心。

我不知道爲什麼你需要這個,但 -

customer.store = store 

應該不會導致重新加載或類似的東西的存儲對象。

+0

感謝您的幫助弗雷德裏克。我必須通過使用Alony的建議來告訴json序列化我的子對象。 – 2012-01-10 16:29:28