在我的用户模型中,我有一个设置为序列化的引导字段。默认情况下,该字段为nil,但计划最终会以此结束:
{
guided_step1 : true,
guided_step1_decision : 33,
guided_step2 : true,
guided_step3 : false,
guided_step4 : false
}
我的问题是,如果我想发布到服务器param [:user] [:guided_step3] = true,那么最终会删除其他所有内容。如何发布并更新字段或插入字段?处理这个用例的正确方法是什么?感谢
答案 0 :(得分:1)
为什么这不起作用?
user = User.find id
user.datastpeps[:guided_step3] = true
user.save
答案 1 :(得分: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}}不会清除哈希值。因此,您需要平衡这种方法的优缺点。