2012-01-10 70 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