0

在我的用户模型中,我有一个设置为序列化的引导字段。默认情况下,该字段是零,但该计划是它结束了这样的后来:使用serialize字段,如何管理更新而不用替换所有内容?

{ 
guided_step1 : true, 
guided_step1_decision : 33, 
guided_step2 : true, 
guided_step3 : false, 
guided_step4 : false 
} 

我的问题是,如果我想发布到服务器PARAM [:用户] [:guided_step3] =真,最终会删除所有其他内容。我如何发布并更新该字段或将其插入?什么是正确的方式来处理这个用例?谢谢

回答

1

我在这里看到两种可能的方法。最简单的是合并在控制器中的哈希值,而不是仅仅把他们送到update_attributes

guided_steps = params[:user].delete(:guided_steps) || {} 
@user.guided_steps = (@user.guided_steps || {}).merge(guided_steps) 
@user.update_attributes(params[:user]) 

另外,如果你真的希望它是自动的,是重新定义为guided_steps作家方法在User型号:

class User < ActiveRecord::Base 
    ... 
    def guided_steps=(new_steps) 
    gs = self.guided_steps || {} 
    gs = gs.merge(new_steps || {}) 
    write_attribute(:guided_steps, gs) 
    end 
    ... 
end 

这应该是这样的,当您在您的控制器中调用@user.update_attributes(params[:user])时,新的guided_steps将与旧的合并。这种方法的一个潜在缺点是,guided_steps=将比以前更不直观。例如,@user.guided_steps = {}不会清除散列。所以这取决于你平衡这种方法的优点和缺点。

1

为什么这不起作用?

user = User.find id 

user.datastpeps[:guided_step3] = true 
user.save 
+0

那么工作,但然后我需要硬编码的一切。我有兴趣使用jQuery ajax文章发布参数,并有轨道做它的魔术更新 – AnApprentice 2012-04-23 00:20:52

+0

所以唯一的办法是,jQuery发送完整的散列,而不仅仅是新的对,你必须依靠它例如,如果同一用户在同一瞬间做了2次,则某些内容将丢失,数据将不一致。 – 2012-04-23 00:25:24

相关问题